2016-04-21 5 views
0

Я пытаюсь зашифровать и дешифровать файл изображения с помощью ElGamal на C++. Он должен использовать шифрование 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)