您的位置:首页 > 运维架构 > Linux

用openssl进行rsa的加密与解密(linux,C++版)

2017-07-25 14:21 821 查看
转自 : http://blog.csdn.net/small_qch/article/details/19330211

初学openssl库,写了一例子,记录一下。
PS:openssl和openssl库的安装就不说了,网上一大把


1:输入命令,生成公钥和私钥(1024位)

openssl genrsa -out prikey.pem 1024
openssl rsa -in privkey.pem -pubout -out pubkey.pem


2:C++小程序

[cpp] view
plain copy

 print?

//demo.cpp  

// g++ demo.cpp -o demo -lcrypto  

#include <openssl/rsa.h>  

#include <openssl/err.h>  

#include <openssl/pem.h>  

  

#include <iostream>  

#include <string>  

#include <cstring>  

#include <cassert>  

using namespace std;  

  

//加密  

std::string EncodeRSAKeyFile( const std::string& strPemFileName, const std::string& strData )  

{  

    if (strPemFileName.empty() || strData.empty())  

    {  

        assert(false);  

        return "";  

    }  

    FILE* hPubKeyFile = fopen(strPemFileName.c_str(), "rb");  

    if( hPubKeyFile == NULL )  

    {  

        assert(false);  

        return "";   

    }  

    std::string strRet;  

    RSA* pRSAPublicKey = RSA_new();  

    if(PEM_read_RSA_PUBKEY(hPubKeyFile, &pRSAPublicKey, 0, 0) == NULL)  

    {  

        assert(false);  

        return "";  

    }  

  

    int nLen = RSA_size(pRSAPublicKey);  

    char* pEncode = new char[nLen + 1];  

    int ret = RSA_public_encrypt(strData.length(), (const unsigned char*)strData.c_str(), (unsigned char*)pEncode, pRSAPublicKey, RSA_PKCS1_PADDING);  

    if (ret >= 0)  

    {  

        strRet = std::string(pEncode, ret);  

    }  

    delete[] pEncode;  

    RSA_free(pRSAPublicKey);  

    fclose(hPubKeyFile);  

    CRYPTO_cleanup_all_ex_data();   

    return strRet;  

}  

  

//解密  

std::string DecodeRSAKeyFile( const std::string& strPemFileName, const std::string& strData )  

{  

    if (strPemFileName.empty() || strData.empty())  

    {  

        assert(false);  

        return "";  

    }  

    FILE* hPriKeyFile = fopen(strPemFileName.c_str(),"rb");  

    if( hPriKeyFile == NULL )  

    {  

        assert(false);  

        return "";  

    }  

    std::string strRet;  

    RSA* pRSAPriKey = RSA_new();  

    if(PEM_read_RSAPrivateKey(hPriKeyFile, &pRSAPriKey, 0, 0) == NULL)  

    {  

        assert(false);  

        return "";  

    }  

    int nLen = RSA_size(pRSAPriKey);  

    char* pDecode = new char[nLen+1];  

  

    int ret = RSA_private_decrypt(strData.length(), (const unsigned char*)strData.c_str(), (unsigned char*)pDecode, pRSAPriKey, RSA_PKCS1_PADDING);  

    if(ret >= 0)  

    {  

        strRet = std::string((char*)pDecode, ret);  

    }  

    delete [] pDecode;  

    RSA_free(pRSAPriKey);  

    fclose(hPriKeyFile);  

    CRYPTO_cleanup_all_ex_data();   

    return strRet;  

}  

  

int main()  

{  

    //原文  

    const string one = "skl;dfhas;lkdfhslk;dfhsidfhoiehrfoishfsidf";  

    cout << "one: " << one << endl;  

  

    //密文(二进制数据)  

    string two = EncodeRSAKeyFile("pubkey.pem", one);  

    cout << "two: " << two << endl;  

  

    //顺利的话,解密后的文字和原文是一致的  

    string three = DecodeRSAKeyFile("prikey.pem", two);  

    cout << "three: " << three << endl;  

    return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: