我正在尝试使用C ++中的ElGamal加密和解密图像文件。它必须使用ElGamal加密。我想保存加密文件和恢复文件。我正在使用Crypto ++库来加密/解密部分。这是我到目前为止所拥有的。
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 :(得分:0)
您的问题是您尝试使用非对称密码系统加密任意大数据。非对称密码系统不能加密长度大于其模数大小的数据。 (见Why doesn't my implementation of ElGamal work for long text strings?)
此限制的典型解决方法是使用标准对称算法(例如AES)对输入执行对称转换,然后使用非对称公钥加密对称密钥。然后,解密通过首先解密对称密钥然后使用对称密钥来解密加密内容来反转操作。
Crypto ++ ElGamal对象提供SymmetricEncrypt和SymmetricDecrypt。这些函数将在对称密钥下加密和解密任意长度的文本,然后在ElGamal公钥下加密对称密钥。 (见Crypto++ Wiki - ElGamal)