首先需要使用openssl生成公钥和私钥,然后对字符串进行签名和认证.
license.h

#pragma once
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <vector>#define DEFAULT_BUFFER_SIZE 8192class License {
public:License() {}~License() {}///获取macvoid parse_mac_address(const char *file_name, const char *match_words, std::string &mac_address){mac_address.c_str();std::ifstream ifs(file_name, std::ios::binary);if (!ifs.is_open()) {return;}char line[4096] = {0};while (!ifs.eof()) {ifs.getline(line, sizeof(line));if (!ifs.good()) {break;}const char *mac = strstr(line, match_words);if (NULL == mac) {continue;}mac += strlen(match_words);while ('\0' != mac[0]) {if (' ' != mac[0] && ':' != mac[0]) {mac_address.push_back(mac[0]);}++mac;}if (!mac_address.empty()) {break;}}ifs.close();}///by_system获取macbool get_mac_address_by_system(std::string &mac_address){mac_address.clear();const char *lshw_result = ".lshw_result.txt";char command[512] = {0};snprintf(command, sizeof(command), "lshw -c network | grep serial | head -n 1 > %s", lshw_result);if (0 == system(command)) {parse_mac_address(lshw_result, "serial:", mac_address);}unlink(lshw_result);return (!mac_address.empty());}///获取本机全部的mac地址bool get_mac_address(std::vector<std::string> &mac_address){struct ifreq ifr;struct ifconf ifc;char buf[2048];int success = 0;int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);if (sock == -1) {printf("socket error\n");return -1;}ifc.ifc_len = sizeof(buf);ifc.ifc_buf = buf;if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) {printf("ioctl error\n");return -1;}struct ifreq* it = ifc.ifc_req;const struct ifreq* const end = it + (ifc.ifc_len / sizeof(struct ifreq));char szMac[64];for (; it != end; ++it) {strcpy(ifr.ifr_name, it->ifr_name);if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopbackif (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {unsigned char * ptr ;ptr = (unsigned char  *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0];snprintf(szMac,64,"%02X:%02X:%02X:%02X:%02X:%02X",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5));printf("%s : %s \n",ifr.ifr_name,szMac);if(strncmp(ifr.ifr_name,"eth",3) == 0){mac_address.push_back(szMac);break;}}}}else{printf("get mac info error\n");return -1;}}}//base64转码char *enbase64(const char *input, size_t length, size_t size){BIO *bmem = NULL;BIO *b64 = NULL;BUF_MEM *bptr = NULL;assert(NULL != input);b64 = BIO_new(BIO_f_base64());bmem = BIO_new(BIO_s_mem());if (NULL == b64 || NULL == bmem) {perror("BIO_new");return NULL;}BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);b64 = BIO_push(b64, bmem);BIO_write(b64, input, length);BIO_flush(b64);BIO_get_mem_ptr(b64, &bptr);if ((unsigned int) (bptr->length + 1) > size) {BIO_free_all(b64);return NULL;}char *result = new char[bptr->length];memset(result, 0, bptr->length);memcpy(result, bptr->data, bptr->length);result[bptr->length] = 0;BIO_free_all(b64);return result;}//base64转码char *debase64(char *input, size_t length, size_t size){BIO *b64 = NULL;BIO *bmem = NULL;assert(NULL != input);if (length > size)return NULL;char *result = new char[size];memset(result, 0, size);b64 = BIO_new(BIO_f_base64());bmem = BIO_new_mem_buf(input, length);BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);if (NULL == b64 || NULL == bmem) {perror("BIO_new");return NULL;}bmem = BIO_push(b64, bmem);BIO_read(bmem, result, length);BIO_free_all(b64);return result;}///签名char *rsa_sign(const char *text, size_t size, const char *sk_filename){RSA *rsa;unsigned int len;char *signature = nullptr;assert(text != NULL && sk_filename != NULL);OpenSSL_add_all_algorithms();BIO *in = NULL;in = BIO_new(BIO_s_file());BIO_read_filename(in, sk_filename);if (in == NULL) {perror(sk_filename);return NULL;}//将IO中数据以PEM格式读入EVP_PKEY结构中rsa = PEM_read_bio_RSAPrivateKey(in, NULL, NULL, NULL);if (in != NULL)BIO_free(in);if (rsa == NULL) {perror("PEM_read_bio_RSAPrivateKey");return NULL;}unsigned char *sig = new unsigned char[RSA_size(rsa)];unsigned char sha1[20] = {'\0'};//result len of sha1:20 bytesSHA1((const unsigned char *) text, strlen(text), sha1);if (1 != RSA_sign(NID_sha1, sha1, 20, sig, &len, rsa)) {delete[] sig;sig = nullptr;RSA_free(rsa);printf("RSA_sign error.\n");return NULL;}signature = enbase64((char *) sig, 128, size);if (!signature) {delete[] sig;sig = nullptr;RSA_free(rsa);printf("enbase64 error.\n");return NULL;}delete[] sig;sig = nullptr;RSA_free(rsa);return signature;}///验证bool rsa_verify(const char *text, char *signature, const char *pk_filename){RSA *rsa;BIO *in = NULL;assert(NULL != text && NULL != signature);in = BIO_new(BIO_s_file());BIO_read_filename(in, pk_filename);if (NULL == in) {printf("BIO_read_filename error.\n");return false;}//将IO中数据以PEM格式读入EVP_PKEY结构中//rsa = PEM_read_bio_RSAPublicKey(in, NULL, NULL, NULL);rsa = PEM_read_bio_RSA_PUBKEY(in, NULL, NULL, NULL);if (in != NULL) BIO_free(in);if (rsa == NULL) {printf("PEM_read_bio_RSA_PUBKEY error.\n");return false;}//unsigned char sig_temp[250];char *sig_debase = debase64(signature, strlen((char *) signature), 250);if (!sig_debase) {RSA_free(rsa);printf("debase64 error.\n");return false;}unsigned char sha1[20];SHA1((const unsigned char *) text, strlen(text), sha1);if (1 != RSA_verify(NID_sha1, sha1, 20, (unsigned char *) sig_debase, 128, rsa)) {delete[] sig_debase;sig_debase = nullptr;RSA_free(rsa);printf("RSA_verify error.\n");return false;}delete[] sig_debase;sig_debase = nullptr;RSA_free(rsa);return true;}//根据license-key.txt获取文件信息char* getlicense(const char* file_name){FILE *pFile;size_t lSize;char *buffer;size_t result;pFile = fopen(file_name, "rb");if (pFile == NULL)fputs("File error", stderr);fseek(pFile, 0, SEEK_END);lSize = ftell(pFile);rewind(pFile);buffer = new char[lSize];if (buffer == NULL)fputs("Memory error", stderr);result = fread(buffer, 1, lSize, pFile);if (result != lSize)fputs("Reading error", stderr);return buffer;}
};

main.cpp

#include <iostream>
#include "license.h"int  main()
{License license;//获取mac_addressstd::vector<std::string> vec_mac_address;license.get_mac_address(vec_mac_address);//给mac_address签名后生成一个字符串char *signature = license.rsa_sign(vec_mac_address[0].c_str(), DEFAULT_BUFFER_SIZE,"rsa_private_key.pem");printf ("signature: %s\n",signature);//把签名后的字符串存到license-key.txtFILE *fp;if((fp=fopen("license-key.txt","a"))==NULL){printf("You can't open the license-key.txt!\n");exit(1);}fprintf(fp,"%s",signature);fclose(fp);//认证bool bRet =license.rsa_verify(vec_mac_address[0].c_str(),signature,"rsa_public_key.pem");if (bRet == true){printf ("认证通过!\n");}else{printf ("认证失败!\n");}delete[] signature;signature = nullptr;return 0;
}

运行结果:
eth1 : 2C:FD:A1:5C:B0:B1
signature: h6dg747tF7Wxa+NNo24uo1vQKO0sYHbBgaXWTzrcG7tsXHbZ5AKAmLK9wopMohhjMFP4HSscYmKwHjaTBCqfWX3gP5RL5Ut2BV7bSbhmtDP/ow4aDBo9+hFSh5SGPBvmGN7bl0l8zER6ugCLASAyj1nQQYAsNySvfe9m9+G8go0=
认证通过!

linux C++ 使用openssl rsa算法实现对计算机物理地址进行签名和认证相关推荐

  1. Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程

    PEM文件有以下格式 1.PEM私钥文件格式 -----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY----- 生成该密钥的Linux命令 : ...

  2. linux c openssl rsa 加解密

    1.PEM私钥文件格式 -----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY----- 生成该密钥的Linux命令:OpenSSL>g ...

  3. Openssl 1024bit RSA算法---公私钥获取和处理(一)

    1.简介 使用OpenSSL生成公私钥文件,然后再将文件中的信息读出的操作. 由于要对设备升级,需要用到RSA算法对一部分验证信息进行加密. 2.使用OpenSSL获取公私钥 我在window系统尝试 ...

  4. linux安装php7 nagnx,iOS下使用rsa算法與php進行加解密通訊

    首先了解一下幾個相關概念,以方便后面遇到的問題的解決: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman發明的,RSA就是取自他們三個人的名字.算法基於一個數 ...

  5. Linux 下使用openSSL 生成RSA密钥对

    1.生成私钥 openssl genrsa -out rsa_private_key.pem 1024 2.将原始私钥转换为pkcs8格式 openssl pkcs8 -topk8 -inform P ...

  6. 使用Openssl的RSA算法生成公私钥对

    openssl的安装参考这里:openssl的安装指导 非对称加密算法:RSA1024 /2048 /3072 /4096 在需要放置公私钥对所在的文件夹下,按住shift键点击右键,选择" ...

  7. 菜鸟学Linux 第044篇笔记 算法和私有CA

    菜鸟学Linux 第044篇笔记 算法和私有CA 证书吊销列表CRL(Certificate Revocation List ) 如何解决私钥丢失 PKI: Public Key Infrastruc ...

  8. crt证书linux使用,linux下使用openssl生成https的crt和key证书

    x509证书一般会用到三类文,key,csr,crt Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时,必须使用自己的私钥来签署申,还 ...

  9. .NET Core 使用RSA算法 加密/解密/签名/验证签名

    前言 前不久移植了支付宝官方的SDK,以适用ASP.NET Core使用支付宝支付,但是最近有好几位用户反应在Linux下使用会出错,调试发现是RSA加密的错误,下面具体讲一讲. RSA在.NET C ...

最新文章

  1. java返回有什么用,java中的return this什么时候用,返回的是类里面的方法类型,还是实例类?上面的代码什么意思...
  2. spring包自动扫描声明
  3. 你的组织为自动化测试做好准备了吗?
  4. 《LeetCode力扣练习》第136题 只出现一次的数字 Java
  5. DPI — 深度数据报文解析
  6. 云监控服务产品优势与应用场景
  7. 一个5节点的polardb mysql_POLARDB问题
  8. 转:ibatis动态sql
  9. React div加载背景图
  10. c语言网上找程序组合,C语言程序我同学说在网上下的一章一章的小说组合成一个太麻烦,于是 爱问知识人...
  11. 最好用的手机端C/C++语言编程软件, 不要说没电脑就不学编程了!
  12. 职场好人缘的26个细节
  13. php auth和rbac区别,THINKPHP中的AUTH权限管理介绍
  14. php验证码完整功能,用PHP实现验证码功能
  15. 【转载】NBU异机恢复oracle
  16. ios十进制、十六进制字符串,byte,data等之间的转换
  17. 新创建虚拟机如何配置ip地址
  18. VS2019、VS2017、VS2013产品密钥
  19. 迭代重心法 matlab,重心法
  20. 【Mybatis源码解析】Mybatis源码体系结构

热门文章

  1. Spark Structured Streaming 解析 JSON
  2. (拿走不谢)H5微信分享时,在苹果手机分享一直不行,公开微信分享完整工具,以及微信地图
  3. iOS开发准备篇-(3)Safari常用快捷键
  4. 【Python零基础入门篇 · 3】:掌握数值类型、进制的转换、字符串、占位符和格式化输入输出、标识符和保留字
  5. ionic 前端 - 汉字转拼音
  6. 如何保障缓存和数据库的一致性(超详细案例)【转载自 程序员囧辉】
  7. 两平面平行但不重合的条件是_____对于不重合的两个平面α与β,给定下列条件:①存在平面γ,使得α,β都平行于γ ②存在平面γ,使得α,β都垂直于γ; ③α内...
  8. 2021.8.12携程笔试第三题:建树游戏DFS
  9. C++下使用glog教程
  10. 模块说和神经网络学说_为什么都说神经网络是个黑箱?