基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签

转载 2015年11月19日 16:34:27

4.生成rsa公钥、私钥,经过base64编码后保存到文件
需要导入一些头文件:

#include "iterhash.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;
}

5.通过生成的公钥文件加密字符串

CString CKeyController::RSAEncryptString( CString encFilename, CString seed, CString message )
{
    string encString;
    FileSource encFile( encFilename.GetBuffer(encFilename.GetLength())truenew 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)truenew 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())truenew 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)truenew 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()truenew 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, truenew 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()truenew 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, truenew 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));
}

10.工具函数如base64转码,字符串转换

std::string CKeyController::EncodeBase64( string message )
{
    string encode;
    StringSource(message, truenew Base64Encoder(new StringSink(encode)));
    return encode;
}

std::string CKeyController::DecodeBase64( string message )
{
    string decode;
    StringSource(message, truenew Base64Decoder(new StringSink(decode)));
    return decode;
}

CString CKeyController::hashString( CString message )
{
    string digest;
    SHA256 hash;
    StringSource foo(c2s(message)truenew HashFilter(hash, new HexEncoder(new StringSink(digest))));
    return CString(digest.c_str());
}

CString CKeyController::hashFile( CString fileName )
{
    string digest;
    SHA256 hash;
    FileSource(fileName, truenew 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;
}

基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签12

4.生成rsa公钥、私钥,经过base64编码后保存到文件 需要导入一些头文件: #include "iterhash.h" #include "files.h" #include "rsa.h" #...
  • u011676589
  • u011676589
  • 2015年01月29日 10:57
  • 2150

基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签

转载于http://www.xdty.org/1678 在项目中需要增加一个注册的功能,想到了用rsa非对称加密的方法。对比了openssl等第三方库,最后采用了Cryptopp。 1.源...
  • u011676589
  • u011676589
  • 2015年01月29日 10:44
  • 1222

基于crypto++的RSA加密

crypto++刚开始也不知道是什么,只是设计过程中需要用crypto++来实现RSA算法的加解密。 首先应该了解crypto++的基本干什么的,这里不加以赘述,可以找更加官方的描述,当然官网找资料是...
  • zzj806683450
  • zzj806683450
  • 2013年12月19日 20:54
  • 2340

Crypto++入门学习笔记(DES、AES、RSA、SHA-256)

背景(只是个人感想,技术上不对后面的内容构成知识性障碍,可以skip): 最近,基于某些原因和需要,笔者需要去了解一下Crypto++库,然后对一些数据进行一些加密解密的操作。 笔者之前没接触过任...
  • u011676589
  • u011676589
  • 2015年01月15日 10:14
  • 1225

crypto++RSA数字签名

本文转载自博客:http://www.bubuko.com/infodetail-2074715.html ---------------------------------------------...
  • woaitingting1985
  • woaitingting1985
  • 2017年11月29日 16:45
  • 55

Crypto++学习总结---RSA

// TestRsa.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "randpool.h"    #include "rs...
  • xs813
  • xs813
  • 2014年02月07日 22:31
  • 1884

Vc6.0下配置 Crypto++ ------用Crypto Library 实现简单的RSA加密

首先创建Crypto__test 工程。         在已编译好的Cryptopp561中找到Debug文件夹 下的cryptlib.lib 将其改名为cryptlibd.lib后放到上级目...
  • hjl243632044
  • hjl243632044
  • 2012年04月27日 17:06
  • 5135

Crypto加密解密RSA测试例子

  • 2015年03月05日 08:45
  • 10.86MB
  • 下载

Crypto++库在VS 2005中的使用——RSA加解密

源代码:下载    一.   下载Crypto++ Library   Crypto++ Library的官方网:http://www.cryptopp.com/   二.   建立自...
  • liujiayu2
  • liujiayu2
  • 2016年06月18日 17:39
  • 672

使用Crypto++5.5.2完成RSA加解密,真正的把公钥放在字符串内,而不是放在文件内

本文摘自小楼一夜听春雨得博客:http://hi.baidu.com/magic475/blog/item/e8b82139020ae622b8998f96.html使用Crypto++5.5.2完成...
  • phker
  • phker
  • 2009年12月22日 15:47
  • 7242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于Crypto++/Cryptopp的rsa密钥生成,rsa加密、解密,rsa签名、验签
举报原因:
原因补充:

(最多只允许输入30个字)