QT openssl RSA非对称加密解密示例(PEM_read_RSAPublicKey AndPEM_read_RSA_PUBKEY)

1:在加密的时候往往由于不同的语言调用openssl库生成的秘钥格式不同 PEM公钥格式文件

(1)-----BEGIN PUBLIC KEY----- 
     -----END PUBLIC KEY----- 
  PEM RSAPublicKey公钥格式文件

(2)-----BEGIN RSA PUBLIC KEY----- 
     -----END RSA PUBLIC KEY----- 

2:针对这两种不同格式的公钥:选择不同的方法进行加密:

(1)PEM_read_RSA_PUBKEY      针对第一种格式
(2)PEM_read_RSAPublicKey    针对第二种格式

3:进行加密:

由于:公钥是begin public key 格式,所以调用 PEM_read_RSA_PUBKEY 方法;
参数:str 为加密的数据   ,publick_key 为公钥的路径
QByteArray http::encode_c(char*str,char*pubkey_path)
{
          RSA * rsa = NULL;
          FILE* fp = NULL;
          char* en = NULL;
          if((fp = fopen(pubkey_path,"rb")) == NULL)
          {
               return NULL;
          }
          /* 读取公钥PEM,PUBKEY格式PEM使用PEM_read_RSA_PUBKEY函数 */
          if((rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL)) == NULL)
          {
              return NULL;
          }
          int rsa_len = RSA_size(rsa);
          en = (char*)malloc(rsa_len);
          int reasult = RSA_public_encrypt(strlen(str), (unsigned char*)str, (unsigned char*)en, rsa, RSA_PKCS1_PADDING);
          if(reasult == -1)
          {
              return NULL;
          }
          RSA_free(rsa);
          return QByteArray(reinterpret_cast<char*>(en),reasult).toBase64();
}

4:进行解密:

QByteArray http::decode_c(char*str,char*prikey_path)
{
       RSA *rsa = NULL;
       FILE*fp = NULL;
       char*de = NULL;
       int rsa_len = 0;
       if((fp = fopen(prikey_path,"rb")) == NULL)
       {
           return "read fail";
       }
       if((rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL)) == NULL) 
       {
           return NULL;
       }
       rsa_len = RSA_size(rsa);
       de = (char*)malloc(rsa_len);
       int reasult=RSA_private_decrypt(strlen(str), (unsigned char*)str, (unsigned char*)de, rsa, RSA_PKCS1_PADDING);
       if( reasult==-1)
       {
           return "";
       }
       RSA_free(rsa);
       fclose(fp);
       return QByteArray(reinterpret_cast<char*>(de),reasult);
}

注意:


1:分段加密:


		  在采用加密的时候,会有512 1024 2028 bit 的 时候, 这个其实是限制加密的数据长度.
		  基本的判断是;  bit 数 /8  - 11  
	      512   bit  			512 / 8 -11     一次性加密 53个字符
          1024 bit 								 一次性加密 117个字符
          2048 bit 								 一次性加密 245 个字符
          这个时候 加密的数据超过了 一次性加密字符数.那就要采用分段加密.
          比如 一次性加密数 为50 , 你有110 个.那就要采用三次加密. 加密后将密文拼接.

2:中文加密:


 			还有一种就是 有中文, 中文是两个字节, 还是以50个加密数为例子.
	 	 	恰巧这回中文 刚好停留在50 和51 的时候,这就有问题了.
  		    简单的方法就是,将数据 先base64 转换 在加密.

欢迎交流: 微信号: yangsenhehe

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章