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