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

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