折腾了快1个小时,将常见的一些加密库都测试一下,再根据情况选择一个应用到项目中去.crypto++国内用得蛮多的,资料还算比较齐全,但是让我讨厌的是源文件太乱,把所有的算法都包括进去了,我目前不能辨别哪些文件是我需要的,所以编译crypto++的源代码生成的静态链接库居然达到了34M,很恐怖啊,软件发布时光这个算法库就得34M,比软件本身还大了,正在想办法提取自己需要的部分.
基于Crtpto++的RSA加密解密算法_第1张图片
#include "randpool.h"
#include "rsa.h"
#include "hex.h"
#include "files.h"
#include



using namespace std;

using namespace CryptoPP;

//------------------------
// 函数声明
//------------------------

void GenerateRSAKey(unsigned int keyLength, const char *privFilename, const char *pubFilename, const char *seed);

string RSAEncryptString( const char *pubFilename, const char *seed, const char *message);

string RSADecryptString( const char *privFilename, const char *ciphertext);

RandomPool & GlobalRNG();



//------------------------
// 主程序
//------------------------

int main()

{

         char priKey[128] = {0};
         char pubKey[128] = {0};
         char seed[1024]    = {0};


         // 生成 RSA 密钥对

        strcpy(priKey, "private.ilcd");     // 生成的私钥文件名

        strcpy(pubKey, "public.ilcd");     // 生成的公钥文件名

        strcpy(seed, "seed");
         //创建公钥,私钥配对
        GenerateRSAKey(1024, priKey, pubKey, seed);



         // RSA 加解密

         char message[1024] = {0};

        strcpy(message, "www.ilcd.tv");

        cout<< "原始字符串:\t"<

         string encryptedText = RSAEncryptString(pubKey, seed, message);     // RSA 加密

        cout<< "加密后字符串:\t"<
         string decryptedText = RSADecryptString(priKey, encryptedText.c_str());     // RSA 解密

        cout<< "解密后字符串:\t"<
         return 0;
}



//------------------------
// 生成RSA密钥对
//------------------------

void GenerateRSAKey(unsigned int keyLength, const char *privFilename, const char *pubFilename, const char *seed)

{

        RandomPool randPool;

        randPool.Put(( byte *)seed, strlen(seed));


        RSAES_OAEP_SHA_Decryptor priv(randPool, keyLength);

        HexEncoder privFile( new FileSink(privFilename));

        priv.DEREncode(privFile);

        privFile.MessageEnd();


        RSAES_OAEP_SHA_Encryptor pub(priv);

        HexEncoder pubFile( new FileSink(pubFilename));

        pub.DEREncode(pubFile);

        pubFile.MessageEnd();

}



//------------------------
// RSA加密
//------------------------

string RSAEncryptString( const char *pubFilename, const char *seed, const char *message)

{

        FileSource pubFile(pubFilename, true, new HexDecoder);

        RSAES_OAEP_SHA_Encryptor pub(pubFile);



        RandomPool randPool;

        randPool.Put(( byte *)seed, strlen(seed));



         string result;

        StringSource(message, true, new PK_EncryptorFilter(randPool, pub, new HexEncoder( new StringSink(result))));

         return result;

}



//------------------------
// RSA解密
//------------------------

string RSADecryptString( const char *privFilename, const char *ciphertext)

{

        FileSource privFile(privFilename, true, new HexDecoder);

        RSAES_OAEP_SHA_Decryptor priv(privFile);


         string result;

        StringSource(ciphertext, true, new HexDecoder( new PK_DecryptorFilter(GlobalRNG(), priv, new StringSink(result))));

         return result;

}



//------------------------

// 定义全局的随机数

//------------------------

RandomPool & GlobalRNG()

{

         static RandomPool randomPool;

         return randomPool;

}