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 に答える