В проекте c ++ я использую CryptoPP для выполнения шифрования AES / CBC / PKCS5Padding для файлов изображений. Ниже приведен код, который я использую (из Хранение IV с зашифрованным текстом Crypto ++ CB C AES шифрование )
#include <iostream>
#include <osrng.h>
#include <files.h>
#include <modes.h>
using namespace std;
using namespace CryptoPP;
int main()
{
cout << "Hello World!\n";
AutoSeededRandomPool prng;
SecByteBlock iv(AES::BLOCKSIZE);
string _key = "0123456789abcdef";
SecByteBlock key((const byte*)_key.data(), _key.size());
RandomNumberSource rs2(prng, AES::BLOCKSIZE, new ArraySink(iv, iv.size()));
CBC_Mode<AES>::Encryption encryptor;
encryptor.SetKeyWithIV(key, key.size(), iv, iv.size());
// Plaintext message
ByteQueue queue;
FileSource source("E:\\ori_pics\\20161224_143119.jpg", true, new Redirector(queue));
SecByteBlock block(queue.MaxRetrievable());
ArraySink sink(block, block.size());
queue.TransferTo(sink);
// Output file
FileSink file("D:\\enc_pics\\20161224_143119.jpg");
// Source wrappers
ArraySource as(iv, iv.size(), true, new Redirector(file));
ArraySource ss(block, block.size(), true, new StreamTransformationFilter(encryptor, new Redirector(file), BlockPaddingSchemeDef::PKCS_PADDING));
}
В этой программе я использую случайный IV и фиксированный ключ , Я пишу IV в начале выходного файла, а затем зашифровываю содержимое файла с помощью PKCS_PADDING
.
Выше программа работает очень хорошо, когда я использую файл .txt в качестве ввода, она генерирует зашифрованный текстовый файл. Но когда я предоставляю .jpg файл размером 55,35,433 байта (приблизительно 5 МБ), тогда в строку кода выдается исключение std::bad_alloc
: FileSource source("E:\\ori_pics\\20161224_143119.jpg", true, new Redirector(queue));
из файла misc.h
из функции CallNewHandler()
.
Что я делаю не так? Почему шифрование файла .txt выполняется той же программой успешно, а .jpg - неудачно?