#include "randpool.h" #include "rsa.h" #include "hex.h" #include "files.h" #include <iostream> using namespace std; using namespace CryptoPP; #pragma comment(lib, "cryptlib.lib") //------------------------ // 函數聲明 //------------------------ 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(); //------------------------ // 主程序 //------------------------ void main() { char priKey[128] = {0}; char pubKey[128] = {0}; char seed[1024] = {0}; // 生成 RSA 密鑰對 strcpy_s(priKey,sizeof(priKey) / sizeof(priKey[0]), "pri"); // 生成的私鑰文件 strcpy_s(pubKey,sizeof(pubKey) / sizeof(pubKey[0]),"pub"); // 生成的公鑰文件 strcpy_s(seed,sizeof(seed) / sizeof(seed[0]),"seed"); GenerateRSAKey(1024, priKey, pubKey, seed); // RSA 加解密 char message[1024] = {0}; cout<<"Origin Text:t"<<"HelloWorld!"<<endl<<endl; strcpy_s(message,sizeof(message) / sizeof(message[0]),"Hello World!"); string encryptedText = RSAEncryptString(pubKey, seed, message); // RSA 加密 [Page] cout<<"Encrypted Text:t"<<encryptedText<<endl<<endl; string decryptedText = RSADecryptString(priKey, encryptedText.c_str()); // RSA 解密 cout<<"Decrypted Text:t"<<decryptedText<<endl<<endl; } //------------------------ // 生成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; }