1、AES针对授权证书加密 + RSA针对Key的加密(对称加密是不收到明文长度影响)
2、RSA超长明文分段加密的方式
这里就介绍RSA超长明文分段加密的简单步:
1、根据生成的RSA生成的长度来分割明文字段长度,加密次数 = 明文长度 / RSA加密字段长度 + 1
2、加密后的Base64字段拼接起来,再通过base64 to string 转成可见密文
//rsa.h
//公钥加解密
static std::string encrypt_RSA_by_long_str_public_key(std::string publicKey, const std::string& data);
static std::string decrypt_RSA_by_long_str_public_key(std::string publicKey, const std::string& data);
//私钥加解密
static std::string encrypt_RSA_by_long_str_private_key(std::string privateKey, const std::string& data);
static std::string decrypt_RSA_by_long_str_private_key(std::string privateKey, const std::string& data);
Cpp代码:
/*
* 公钥加密
*/
std::string CRSA::encrypt_RSA_by_long_str_public_key(std::string publicKey, const std::string& data)
{
std::string strRet;
///创建RSA指针
RSA* rsa = create_RSA((unsigned char*)publicKey.c_str(), true);
int len = RSA_size(rsa);
char* decryptedText = (char*)malloc(len + 1);
memset(decryptedText, 0, len + 1);
int nClearDataLen = data.length();
int pdBlock = len - 11;
int nCount = (nClearDataLen / pdBlock) + 1;//分段次数
unsigned char* pClearData = (unsigned char*)data.c_str();
//分段加密
for (int i = 0; i < nCount; i++)
{
int nSize = 0;
pdBlock = (nClearDataLen > pdBlock) ? pdBlock : nClearDataLen;
nSize = RSA_public_encrypt(pdBlock, (const unsigned char*)pClearData, (unsigned char*)decryptedText, rsa, RSA_PKCS1_PADDING);
pClearData += pdBlock;
nClearDataLen -= pdBlock;
if (nSize >= 0)
{
strRet += std::string(decryptedText, nSize);
}
}
// 释放内存
delete decryptedText;
RSA_free(rsa);
return strRet;
}
/*
* 公钥解密
*/
std::string CRSA::decrypt_RSA_by_long_str_public_key(std::string publicKey, const std::string& data)
{
std::string strRet;
///创建RSA指针
RSA* rsa = create_RSA((unsigned char*)publicKey.c_str(), true);
int len = RSA_size(rsa);
int nClearDataLen = data.length();
int pdBlock = len;
int nCount = (nClearDataLen / pdBlock) + 1;//分段次数
unsigned char* pClearData = (unsigned char*)data.c_str();
//分段解密
for (int i = 0; i < nCount; i++)
{
int nSize = 0;
char* decryptedText = (char*)malloc(len + 1);
memset(decryptedText, 0, len + 1);
pdBlock = (nClearDataLen > pdBlock) ? pdBlock : nClearDataLen;
nSize = RSA_public_decrypt(pdBlock, (const unsigned char*)pClearData, (unsigned char*)decryptedText, rsa, RSA_PKCS1_PADDING);
pClearData += pdBlock;
nClearDataLen -= pdBlock;
if (nSize >= 0)
{
strRet += std::string(decryptedText, nSize);
}
}
// 释放内存
RSA_free(rsa);
return strRet;
}
/*
* 私钥加密
*/
std::string CRSA::encrypt_RSA_by_long_str_private_key(std::string privateKey, const std::string& data)
{
std::string strRet;
///创建RSA指针
RSA* rsa = create_RSA((unsigned char*)privateKey.c_str(), false);
int len = RSA_size(rsa);
char* decryptedText = (char*)malloc(len + 1);
memset(decryptedText, 0, len + 1);
int nClearDataLen = data.length();
int pdBlock = len - 11;
int nCount = (nClearDataLen / pdBlock) + 1;//分段次数
unsigned char* pClearData = (unsigned char*)data.c_str();
//分段加密
for (int i = 0; i < nCount; i++)
{
int nSize = 0;
pdBlock = (nClearDataLen > pdBlock) ? pdBlock : nClearDataLen;
nSize = RSA_private_encrypt(pdBlock, (const unsigned char*)pClearData, (unsigned char*)decryptedText, rsa, RSA_PKCS1_PADDING);
pClearData += pdBlock;
nClearDataLen -= pdBlock;
if (nSize >= 0)
{
strRet += std::string(decryptedText, nSize);
}
}
// 释放内存
delete decryptedText;
RSA_free(rsa);
return strRet;
}
/*
* 私钥解密
*/
std::string CRSA::decrypt_RSA_by_long_str_private_key(std::string privateKey, const std::string& data)
{
std::string strRet;
///创建RSA指针
RSA* rsa = create_RSA((unsigned char*)privateKey.c_str(), false);
int len = RSA_size(rsa);
int nClearDataLen = data.length();
int pdBlock = len;
int nCount = (nClearDataLen / pdBlock) + 1;//分段次数
unsigned char* pClearData = (unsigned char*)data.c_str();
//分段解密
for (int i = 0; i < nCount; i++)
{
int nSize = 0;
char* decryptedText = (char*)malloc(len + 1);
memset(decryptedText, 0, len + 1);
pdBlock = (nClearDataLen > pdBlock) ? pdBlock : nClearDataLen;
nSize = RSA_private_decrypt(pdBlock, (const unsigned char*)pClearData, (unsigned char*)decryptedText, rsa, RSA_PKCS1_PADDING);
pClearData += pdBlock;
nClearDataLen -= pdBlock;
if (nSize >= 0)
{
strRet += std::string(decryptedText, nSize);
}
}
// 释放内存
RSA_free(rsa);
return strRet;
}
版权声明:本文为 begonia\_\_z 原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。https://blog.csdn.net/begonia\_\_z/article/details/108336245