
#include
"randpool.h" 
#include
"rsa.h" 
#include
"hex.h" 
#include
"files.h" 
#include <iostream>



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"<<message<<endl<<endl;


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

cout<<
"加密后字符串:\t"<<encryptedText<<endl<<endl;

string decryptedText = RSADecryptString(priKey, encryptedText.c_str());
// RSA 解密 

cout<<
"解密后字符串:\t"<<decryptedText<<endl<<endl;

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;


}