2016-04-21 13 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を提供します。これらの関数は、symmerticキーの下にある任意の長さのテキストを暗号化および復号化し、ElGamal公開キーの下にある対称キーを暗号化します。 (Crypto++ Wiki - ElGamal参照)

関連する問題