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

最后修改:2023 年 12 月 23 日
如果觉得我的文章对你有用,请随意赞赏