2016-04-21 31 views
0

我想用C++中的ElGamal加密和解密圖像文件。它必須使用ElGamal加密。我想保存加密文件和恢復的文件。我正在使用加密/解密部分的Crypto ++庫。這是我到目前爲止。使用ElGamal加密/解密圖像文件

AutoSeededRandomPool prng; 

ElGamal::Decryptor decryptor; 
decryptor.AccessKey().GenerateRandomWithKeySize(prng, 2048); 
const ElGamalKeys::PrivateKey& privateKey = decryptor.AccessKey(); 

ElGamal::Encryptor encryptor(decryptor); 
const PublicKey& publicKey = encryptor.AccessKey(); 

string ofilename = "test.bmp"; 
string efilename = "test.enc"; 
string rfilename = "test-recovered.bmp"; 

FileSource fs1(ofilename.c_str(), true, encryptor.CreateEncryptionFilter(encryptor.Encrypt, new FileSink(efilename.c_str()))); 

FileSource fs2(efilename.c_str(), true, decryptor.CreateDecryptionFilter(decryptor.Decrypt, new FileSink(rfilename.c_str()))); 

我被困在加密和解密部分。任何幫助將不勝感激!

回答

0

你的問題是你試圖使用非對稱密碼系統來加密任意大的數據。非對稱密碼系統不能加密長度大於其模數大小的數據。 (請參閱Why doesn't my implementation of ElGamal work for long text strings?

此限制的典型解決方法是使用標準對稱算法(例如AES)對輸入執行對稱變換,然後使用非對稱公鑰對對稱密鑰進行加密。解密然後通過首先解密對稱密鑰然後使用對稱密鑰來解密加密的內容來反轉操作。

Crypto ++ ElGamal對象提供了SymmetricEncrypt和SymmetricDecrypt。這些函數將在對稱密鑰下加密和解密任意長度的文本,然後在ElGamal公鑰下加密對稱密鑰。 (見Crypto++ Wiki - ElGamal