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 转换 在加密.
代码地址: https://github.com/heisai/RsaEncipherMent/tree/master