基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签
来源:互联网 发布:新手开淘宝店怎么才有生意 编辑:程序博客网 时间:2024/05/22 05:19
4.生成rsa公钥、私钥,经过base64编码后保存到文件
需要导入一些头文件:
#include "iterhash.h"
#include "files.h"
#include "rsa.h"
#include "randpool.h"
#include "hex.h"
#include "base64.h"
#include "osrng.h"
#include "files.h"
#include "rsa.h"
#include "randpool.h"
#include "hex.h"
#include "base64.h"
#include "osrng.h"
void CKeyController::GenerateRSAKey(unsigned int keyLength, CString decFilename, CString encFilename, CString seed)
{
RandomPool randPool;
randPool.Put((byte *)seed.GetBuffer(seed.GetLength()), seed.GetLength());
RSAES_OAEP_SHA_Decryptor decrypt(randPool, keyLength);
HexEncoder decFile(new Base64Encoder(new FileSink(decFilename.GetBuffer(decFilename.GetLength()))));
decrypt.DEREncode(decFile);
decFile.MessageEnd();
RSAES_OAEP_SHA_Encryptor encrypt(decrypt);
HexEncoder encFile(new Base64Encoder(new FileSink(encFilename.GetBuffer(encFilename.GetLength()))));
encrypt.DEREncode(encFile);
encFile.MessageEnd();
return;
}
RandomPool & CKeyController::GlobalRNG()
{
static RandomPool randomPool;
return randomPool;
}
{
RandomPool randPool;
randPool.Put((byte *)seed.GetBuffer(seed.GetLength()), seed.GetLength());
RSAES_OAEP_SHA_Decryptor decrypt(randPool, keyLength);
HexEncoder decFile(new Base64Encoder(new FileSink(decFilename.GetBuffer(decFilename.GetLength()))));
decrypt.DEREncode(decFile);
decFile.MessageEnd();
RSAES_OAEP_SHA_Encryptor encrypt(decrypt);
HexEncoder encFile(new Base64Encoder(new FileSink(encFilename.GetBuffer(encFilename.GetLength()))));
encrypt.DEREncode(encFile);
encFile.MessageEnd();
return;
}
RandomPool & CKeyController::GlobalRNG()
{
static RandomPool randomPool;
return randomPool;
}
5.通过生成的公钥文件加密字符串
CString CKeyController::RSAEncryptString( CString encFilename, CString seed, CString message )
{
string encString;
FileSource encFile( encFilename.GetBuffer(encFilename.GetLength()), true, new Base64Decoder(new StringSink(encString)) );
HexDecoder decoder;
decoder.Put( (byte*)encString.c_str(), encString.size() );
decoder.MessageEnd();
RSAES_OAEP_SHA_Encryptor enc;
enc.AccessKey().Load(decoder);
RandomPool randPool;
randPool.Put( (byte *)seed.GetBuffer(seed.GetLength()), seed.GetLength() );
string result;
StringSource( c2s(message), true, new PK_EncryptorFilter(randPool, enc, new HexEncoder(new StringSink(result))) );
return CString(result.c_str());
}
{
string encString;
FileSource encFile( encFilename.GetBuffer(encFilename.GetLength()), true, new Base64Decoder(new StringSink(encString)) );
HexDecoder decoder;
decoder.Put( (byte*)encString.c_str(), encString.size() );
decoder.MessageEnd();
RSAES_OAEP_SHA_Encryptor enc;
enc.AccessKey().Load(decoder);
RandomPool randPool;
randPool.Put( (byte *)seed.GetBuffer(seed.GetLength()), seed.GetLength() );
string result;
StringSource( c2s(message), true, new PK_EncryptorFilter(randPool, enc, new HexEncoder(new StringSink(result))) );
return CString(result.c_str());
}
6.通过生成的私钥文件解密字符串
CString CKeyController::RSADecryptString( CString decFilename, CString ciphertext )
{
string decString;
FileSource decFile( decFilename.GetBuffer(decFilename.GetLength()), true, new Base64Decoder(new StringSink(decString)) );
HexDecoder decoder;
decoder.Put( (byte*)decString.c_str(), decString.size() );
decoder.MessageEnd();
RSAES_OAEP_SHA_Decryptor dec;
dec.AccessKey().Load(decoder);
string result;
StringSource( c2s(ciphertext), true, new HexDecoder(new PK_DecryptorFilter(GlobalRNG(), dec, new StringSink(result))) );
return CString(result.c_str());
}
{
string decString;
FileSource decFile( decFilename.GetBuffer(decFilename.GetLength()), true, new Base64Decoder(new StringSink(decString)) );
HexDecoder decoder;
decoder.Put( (byte*)decString.c_str(), decString.size() );
decoder.MessageEnd();
RSAES_OAEP_SHA_Decryptor dec;
dec.AccessKey().Load(decoder);
string result;
StringSource( c2s(ciphertext), true, new HexDecoder(new PK_DecryptorFilter(GlobalRNG(), dec, new StringSink(result))) );
return CString(result.c_str());
}
7.使用私钥签名
CString CKeyController::SignMessage( const std::string& privateKeyFileName, const std::string& message )
{
std::string signedMessage = "";
string encString;
FileSource privFile( privateKeyFileName.c_str(), true, new Base64Decoder(new StringSink(encString)));
RSASSA_PKCS1v15_SHA_Signer priv;
HexDecoder decoder;
decoder.Put( (byte*)encString.c_str(), encString.size() );
decoder.MessageEnd();
priv.AccessKey().Load(decoder);
AutoSeededRandomPool rng;
StringSource s1(message, true, new SignerFilter(rng, priv, new HexEncoder(new StringSink(signedMessage))));
return CString(signedMessage.c_str());
}
{
std::string signedMessage = "";
string encString;
FileSource privFile( privateKeyFileName.c_str(), true, new Base64Decoder(new StringSink(encString)));
RSASSA_PKCS1v15_SHA_Signer priv;
HexDecoder decoder;
decoder.Put( (byte*)encString.c_str(), encString.size() );
decoder.MessageEnd();
priv.AccessKey().Load(decoder);
AutoSeededRandomPool rng;
StringSource s1(message, true, new SignerFilter(rng, priv, new HexEncoder(new StringSink(signedMessage))));
return CString(signedMessage.c_str());
}
8.使用公钥验证签名
bool CKeyController::VerifySignature( const std::string& publicKeyFileName, const std::string& message, const std::string& signedMessage )
{
string decString;
FileSource pubFile( publicKeyFileName.c_str(), true, new Base64Decoder(new StringSink(decString)) );
RSASSA_PKCS1v15_SHA_Verifier pub;
HexDecoder decoder;
decoder.Put( (byte*)decString.c_str(), decString.size() );
decoder.MessageEnd();
pub.AccessKey().Load(decoder);
StringSource signatureFile( signedMessage, true, new HexDecoder);
if (signatureFile.MaxRetrievable() != pub.SignatureLength())
{ throw std::string( "Signature Size Problem" ); }
SecByteBlock signature(pub.SignatureLength());
signatureFile.Get(signature, signature.size());
VerifierFilter *verifierFilter = new VerifierFilter(pub);
verifierFilter->Put(signature, pub.SignatureLength());
StringSource s(message, true, verifierFilter);
return verifierFilter->GetLastResult();
}
{
string decString;
FileSource pubFile( publicKeyFileName.c_str(), true, new Base64Decoder(new StringSink(decString)) );
RSASSA_PKCS1v15_SHA_Verifier pub;
HexDecoder decoder;
decoder.Put( (byte*)decString.c_str(), decString.size() );
decoder.MessageEnd();
pub.AccessKey().Load(decoder);
StringSource signatureFile( signedMessage, true, new HexDecoder);
if (signatureFile.MaxRetrievable() != pub.SignatureLength())
{ throw std::string( "Signature Size Problem" ); }
SecByteBlock signature(pub.SignatureLength());
signatureFile.Get(signature, signature.size());
VerifierFilter *verifierFilter = new VerifierFilter(pub);
verifierFilter->Put(signature, pub.SignatureLength());
StringSource s(message, true, verifierFilter);
return verifierFilter->GetLastResult();
}
9.测试函数调用
void CKeyController::testRSA()
{
CString encryptKey = _T("key.pub");
CString decryptKey = _T("key.pri");
CString seed = _T("seed");
//GenerateRSAKey( 1024, decryptKey, encryptKey, seed );
CString message = _T("X3BA-9NSF-8N9Q-UWQC-U7FX-AZZF-JAJW");
CString encryptedText = RSAEncryptString( encryptKey, seed, message );
CString decryptedText = RSADecryptString( decryptKey, encryptedText );
CString signedMessage = SignMessage("key.pri", c2s(decryptedText));
bool verified = VerifySignature("key.pub", c2s(message), c2s(signedMessage));
}
{
CString encryptKey = _T("key.pub");
CString decryptKey = _T("key.pri");
CString seed = _T("seed");
//GenerateRSAKey( 1024, decryptKey, encryptKey, seed );
CString message = _T("X3BA-9NSF-8N9Q-UWQC-U7FX-AZZF-JAJW");
CString encryptedText = RSAEncryptString( encryptKey, seed, message );
CString decryptedText = RSADecryptString( decryptKey, encryptedText );
CString signedMessage = SignMessage("key.pri", c2s(decryptedText));
bool verified = VerifySignature("key.pub", c2s(message), c2s(signedMessage));
}
10.工具函数如base64转码,字符串转换
std::string CKeyController::EncodeBase64( string message )
{
string encode;
StringSource(message, true, new Base64Encoder(new StringSink(encode)));
return encode;
}
std::string CKeyController::DecodeBase64( string message )
{
string decode;
StringSource(message, true, new Base64Decoder(new StringSink(decode)));
return decode;
}
CString CKeyController::hashString( CString message )
{
string digest;
SHA256 hash;
StringSource foo(c2s(message), true, new HashFilter(hash, new HexEncoder(new StringSink(digest))));
return CString(digest.c_str());
}
CString CKeyController::hashFile( CString fileName )
{
string digest;
SHA256 hash;
FileSource(fileName, true, new HashFilter(hash, new HexEncoder(new StringSink(digest))));
return CString(digest.c_str());
}
std::string c2s( CString &cs )
{
CT2CA pszConvertedAnsiString(cs);
std::string strStd(pszConvertedAnsiString);
return strStd;
}
{
string encode;
StringSource(message, true, new Base64Encoder(new StringSink(encode)));
return encode;
}
std::string CKeyController::DecodeBase64( string message )
{
string decode;
StringSource(message, true, new Base64Decoder(new StringSink(decode)));
return decode;
}
CString CKeyController::hashString( CString message )
{
string digest;
SHA256 hash;
StringSource foo(c2s(message), true, new HashFilter(hash, new HexEncoder(new StringSink(digest))));
return CString(digest.c_str());
}
CString CKeyController::hashFile( CString fileName )
{
string digest;
SHA256 hash;
FileSource(fileName, true, new HashFilter(hash, new HexEncoder(new StringSink(digest))));
return CString(digest.c_str());
}
std::string c2s( CString &cs )
{
CT2CA pszConvertedAnsiString(cs);
std::string strStd(pszConvertedAnsiString);
return strStd;
}
0 0
- 基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签
- 基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签
- 基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签12
- 基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签
- 基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签12
- RSA密钥生成、加密解密、签名验签
- RSA密钥生成、加密解密、数据签名验签
- php rsa 加密、解密、签名、验签
- RSA加密、解密、签名、验签 DSA签名、验签
- 基于crypto++的RSA加密
- python实现aes加密解密,RSA签名和验签,RSA加密解密,并调用接口
- python实现aes加密解密,RSA签名和验签,RSA加密解密,并调用接口
- JAVA RSA签名 验签 以及 加密解密
- RSA用秘钥签名与验签 加密解密
- openssl rsa 加密,解密,签名,验签简单例子
- 微信小程序-RSA签名、验签、加密、解密
- RSA加解密与签名验签
- PHP rsa密钥生成 加密解密
- 年终购物季,不得不看的营销”血拼“策略
- ip库处理
- 最小生成树-MST算法详解及代码实现
- Linux rpm 命令参数使用详解
- mybaits获取的结果集不能成功转JSON格式的问题
- 基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签
- Maven学习(六)- 构建Hibernate项目
- 网站只有首页能打开,其他页面404
- CEditView详解
- android 中文网站
- 第二章 一切都是对象
- Openwrt 网络存储NAS之FTP服务
- Android图案密码,手势锁源码解析
- 通用的Storyboard