用openssl进行rsa的加密与解密(linux,C++版)
2017-07-25 14:21
821 查看
转自 : http://blog.csdn.net/small_qch/article/details/19330211
初学openssl库,写了一例子,记录一下。
PS:openssl和openssl库的安装就不说了,网上一大把
openssl genrsa -out prikey.pem 1024
openssl rsa -in privkey.pem -pubout -out pubkey.pem
[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;
}
初学openssl库,写了一例子,记录一下。
PS:openssl和openssl库的安装就不说了,网上一大把
1:输入命令,生成公钥和私钥(1024位)
openssl genrsa -out prikey.pem 1024openssl rsa -in privkey.pem -pubout -out pubkey.pem
2:C++小程序
[cpp] viewplain 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;
}
相关文章推荐
- 用openssl进行rsa的加密与解密(linux,C++版)
- 用openssl进行rsa的加密与解密(linux,C++版)
- C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)
- Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程
- C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)
- C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)
- C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)
- 利用openssl进行RSA加密解密
- 利用openssl进行RSA加密解密
- 在VS中编译openssl进行RSA加密解密
- OpenSSL生成证书进行iOS加密,java解密的RSA非对称加密 详解
- 利用openssl进行RSA加密解密
- 利用openssl进行RSA加密解密
- 利用openssl进行RSA加密解密
- openssl命令行进行RSA加密解密
- 关于openssl rsa php c++ js 协同加密解密的一些资源链接
- Linux下利用openssl对文件进行加密和解密
- iOS -- OpenSSL进行RSA加密解密概念
- linux下使用openssl对文件RSA加密解密
- linux下使用openssl对文件RSA加密解密