0

我正在尝试使用 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())));

我被困在加密和解密部分。任何帮助将不胜感激!

4

1 回答 1

0

您的问题是您正在尝试使用非对称密码系统加密任意大的数据。非对称密码系统不能加密长度大于其模数大小的数据。(请参阅为什么我的 ElGamal 实现不适用于长文本字符串?

解决此限制的典型解决方法是使用标准对称算法(例如 AES)对输入执行对称转换,然后使用非对称公钥加密对称密钥。然后,解密通过首先解密对称密钥然后使用对称密钥来解密加密内容来反转操作。

Crypto++ ElGamal 对象提供 SymmetricEncrypt 和 SymmetricDecrypt。这些函数将在对称密钥下加密和解密任意长度的文本,然后在 ElGamal 公钥下加密对称密钥。(参见Crypto++ Wiki - ElGamal

于 2016-04-25T07:42:47.643 回答