RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例

前提:秘钥长度=1024

==============================================

    对一片(117字节)明文加密  私加

==============================================

// 私钥加密
std::string rsa_pri_encrypt(const std::string &clearText,  std::string &pubKey)
{
    std::string strRet;
    BIO *keybio = BIO_new_mem_buf((unsigned char *)pubKey.c_str(), -1);
    // 此处有三种方法
    // 1, 读取内存里生成的密钥对,再从内存生成rsa
    // 2, 读取磁盘里生成的密钥对文本文件,在从内存生成rsa
    // 3,直接从读取文件指针生成rsa
    //RSA* pRSAPublicKey = RSA_new();
    RSA* rsa = RSA_new();
    rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);
    if (!rsa)
    {
            BIO_free_all(keybio);
            return std::string("");
    }

    int len = RSA_size(rsa);
    //int len = 1028;
    char *encryptedText = (char *)malloc(len + 1);
    memset(encryptedText, 0, len + 1);  

    // 加密
    int ret = RSA_private_encrypt(clearText.length(), (const unsigned char*)clearText.c_str(), (unsigned char*)encryptedText, rsa, RSA_PKCS1_PADDING);
    if (ret >= 0)
        strRet = std::string(encryptedText, ret);  

    // 释放内存
    free(encryptedText);
    BIO_free_all(keybio);
    RSA_free(rsa);  

    return strRet;
}  

==============================================

    对一片(128字节)密文解密  公解

==============================================

// 公钥解密
std::string rsa_pub_decrypt(const std::string &clearText,  std::string &pubKey)
{
    std::string strRet;
    BIO *keybio = BIO_new_mem_buf((unsigned char *)pubKey.c_str(), -1);
    //keybio = BIO_new_mem_buf((unsigned char *)strPublicKey.c_str(), -1);
    // 此处有三种方法
    // 1, 读取内存里生成的密钥对,再从内存生成rsa
    // 2, 读取磁盘里生成的密钥对文本文件,在从内存生成rsa
    // 3,直接从读取文件指针生成rsa
    //RSA* pRSAPublicKey = RSA_new();
    RSA* rsa = RSA_new();
    rsa = PEM_read_bio_RSAPublicKey(keybio, &rsa, NULL, NULL);
    if (!rsa)
    {
            BIO_free_all(keybio);
            return std::string("");
    }

    int len = RSA_size(rsa);
    //int len = 1028;
    char *encryptedText = (char *)malloc(len + 1);
    memset(encryptedText, 0, len + 1);  

    //解密
    int ret = RSA_public_decrypt(clearText.length(), (const unsigned char*)clearText.c_str(), (unsigned char*)encryptedText, rsa, RSA_PKCS1_PADDING);
    if (ret >= 0)
        strRet = std::string(encryptedText, ret);  

    // 释放内存
    free(encryptedText);
    BIO_free_all(keybio);
    RSA_free(rsa);  

    return strRet;
}

==============================================

    对整体   明文加密  私加

==============================================

//私钥加密 + 分片
std::string rsa_pri_split117_encrypt(const std::string &clearText,  std::string &pubKey)
{
    std::string result;
    std::string input;
    result.clear();
    for(int i = 0 ; i < clearText.length()/117; i++)
    {
           input.clear();
           input.assign(clearText.begin() + i*117, clearText.begin() + i*117 + 117);
           result = result + rsa_pri_encrypt(input, pubKey);
    }
    if( clearText.length()%117 != 0)
    {
        int tem1 = clearText.length()/117*117;
        int tem2 = clearText.length() - tem1;
        input.clear();
        input.assign(clearText.begin()+ tem1, clearText.end());
        result = result + rsa_pri_encrypt(input, pubKey);
    }
    return result;
}

==============================================

    对整体   密文解密  公解

==============================================

//公钥解密 + 分片
std::string rsa_pub_split128_decrypt(const std::string &clearText,  std::string &pubKey)
{
    //Base64 *base = new Base64();
    std::string result;
    std::string input;
    result.clear();
    for(int i = 0 ; i< clearText.length()/128; i++)
    {
        input.clear();
        input.assign(clearText.begin() + i*128, clearText.begin() + i*128 + 128);

        result = result + rsa_pub_decrypt(input, pubKey);
    }
    if(clearText.length()%128 != 0)
    {
        int tem1 = clearText.length()/128 * 128;
        int tem2 = clearText.length() - tem1;
        input.clear();
        input.assign(clearText.begin()+ tem1, clearText.end());
        result = result + rsa_pri_encrypt(input, pubKey);
    }
    return result;
}

附1:rsa 公加私解

附2:C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解

原文地址:https://www.cnblogs.com/azbane/p/10180464.html

时间: 2024-09-29 13:19:57

RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例的相关文章

RSA公钥加密—私钥解密&amp;私钥加密—公钥解密&amp;私钥签名—公钥验证签名

关于RSA算法,前面有介绍,点击打开链接. 这里直接有实现. 代码太多就不直接贴了,免积分下载. http://download.csdn.net/detail/acmjk/7310847 RSA公钥加密-私钥解密&私钥加密-公钥解密&私钥签名-公钥验证签名,布布扣,bubuko.com

RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价. .NET提供常用的加密算法类,支持RSA的类是RSACryptoServiceProvider(命名空间:System.Security.Cryptography),但只支持公钥加密,私钥解密.RSACr

基于私钥加密公钥解密的RSA算法C#实现

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价.    RSA的安全性依赖于大数分解.公钥和私钥都是两个大素数( 大于 100个十进制位)的函数.据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积.     密钥对的产生.选择两个大素数,p

基于私钥加密公钥解密的RSA算法C#实现方法

本文实例讲述了基于私钥加密公钥解密的RSA算法C#实现方法,是一种应用十分广泛的算法.分享给大家供大家参考之用.具体方法如下: 一.概述 RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价. RSA的安全性依赖于大数分解.公钥和私钥都是两个大素数( 大于 1

关于私钥加密 公钥解密

如果只是单方面采用非对称性加密算法,其实有两种方式,用于不同用处.第一种是签名,使用私钥加密,公钥解密,用于让所有公钥所有者验证私钥所有者的身份并且用来防止私钥所有者发布的内容被篡改.但是不用来保证内容不被他人获得.第二种是加密,用公钥加密,私钥解密,用于向公钥所有者发布信息,这个信息可能被他人篡改,但是无法被他人获得.如果甲想给乙发一个安全的保密的数据,那么应该甲乙各自有一个私钥,甲先用乙的公钥加密这段数据,再用自己的私钥加密这段加密后的数据.最后再发给乙,这样确保了内容即不会被读取,也不会被

私钥加密公钥解密或者公钥加密私钥解密有意义吗?

"1.如果是私钥加密,公钥解密的话,因为公钥是公开出来的,所以拿到公钥的人 ,是可以解密报文的,我认为这种加密方式没意义." 你理解有误. 这种场景是用作签名的, 就是校验信息发送者身份. 只有通过特定私钥的的信息才能被公开出来的公钥解密. 这就唯一确定了信息发送者, 达到签名(不可抵赖)的目的. "2.如果是公钥加密,私钥解密的话,因为公钥是公开出来的,所以系统是无法识别请求就是指定系统发送的,也就是别人是可以模拟你的报文,请求你的系统." 这种场景是做信息加密用

RSA,JAVA私钥加密,C#公钥解密

做这个东西在坑里爬了3天才爬出来,记录下供园友参考.C#程序员一枚,项目需要和Java做数据交互,对方甩了段密文和一个CER证书给我,然后我要对其密文进行解密. RSA 非对称加密,对方用私钥加密,我用公钥解密.关于证书的一点说明:证书类型有两种 .pfx 和 .cer ,其中 .pfx 证书既包含公钥也包含私钥, 而 .cer 证书只包含公钥. C#默认RSA只支持公钥加密,私钥解密.而现在的需求正好相反,因此想要直接用C#内置加密类肯定是行不通的.而且C#和Java的RSA加密并不互通.经过

Python使用rsa模块实现非对称加密与解密

Python使用rsa模块实现非对称加密与解密 1.简单介绍: RSA加密算法是一种非对称加密算法 是由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制.加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的. RSA密钥至少为500位长,一般推荐使用1024位.RSA密钥长度随着保密级别提高,增加很快. 由于RSA的特性,一个1024位的密钥只能加密117位字节数据,当数据量超过117位字节的时候,程序就会抛出异常. --来自大佬 2.代码实现: 来一段大佬的代码

C++调用openssl库生成RSA加密秘钥对

直接上代码.默认生成的是pkcs#1格式 // ---- rsa非对称加解密 ---- // #define KEY_LENGTH 1024 // 密钥长度 #define PUB_KEY_FILE "pubkey.pem" // 公钥路径 #define PRI_KEY_FILE "prikey.pem" // 私钥路径 // 函数方法生成密钥对 void generateRSAKey(std::string strKey[2]) { // 公私密钥对 size_