Встроенное шифрование / дешифрование в режиме AES CBC / ECB с использованием Crypto ++

Разрешено ли явно использовать тот же буфер для открытого текста / зашифрованного текста при выполнении шифрования / дешифрования AES в режимах CBC и ECB с использованием Crypto ++ (при условии, что размер буфера достаточен для размещения зашифрованных данных), как в следующем коде:

#include <cstdio>
#include <cassert>
#include "cryptopp\rsa.h"#include "cryptopp\rijndael.h"#include "cryptopp\modes.h"int main()
{
using namespace CryptoPP;
byte key[32], iv[Rijndael::BLOCKSIZE];
char testdata[] = "Crypto++ Test"; // any data can be here

size_t buffer_size = (sizeof(testdata) + Rijndael::BLOCKSIZE) & ~(Rijndael::BLOCKSIZE - 1);
byte* buffer = new byte[buffer_size];
memcpy(buffer, testdata, sizeof(testdata));

// encrypt data inplace
CBC_Mode<Rijndael>::Encryption enc(key, sizeof(key), iv);
MeterFilter meter(new ArraySink(buffer, buffer_size));
ArraySource(buffer, sizeof(testdata), true, new StreamTransformationFilter(enc, new Redirector(meter), BlockPaddingSchemeDef::PKCS_PADDING));
assert(meter.GetTotalBytes() == buffer_size);

// decrypt data inplace
CBC_Mode<Rijndael>::Decryption dec(key, sizeof(key), iv);
MeterFilter meter2(new ArraySink(buffer, buffer_size));
ArraySource(buffer, buffer_size, true, new StreamTransformationFilter(dec, new Redirector(meter2), BlockPaddingSchemeDef::PKCS_PADDING));
assert(meter2.GetTotalBytes() == sizeof(testdata));

printf("%s\n", static_cast<char*>(buffer));
delete buffer;
}

3

Решение

Обычно буферы Crypto ++ могут быть одинаковыми или различаться. Я не могу вспомнить ситуацию, когда им не разрешается быть одинаковыми для обработки на месте или на месте простого текста или данных зашифрованного текста. Единственное предостережение — буфер должен быть достаточно большим для расширения зашифрованного текста.

Вы также должны быть осторожны с перекрытием, но то, как вы можете попасть в проблему, зависит от шифра. Например, AES в CBC_Mode работает с 16-байтовыми блоками (интересующие функции ProcessBlock, ProcessXorBlock, и друзья). Вы можете использовать перекрывающийся буфер, если разница между указателями составляет 17 байт (или больше). В случае RSA вам, вероятно, понадобится разница MaxPreImage размер, который основан на размере модуля.

Наконец, старый FAQ по Crypto ++ кратко описывает его как «встроенную обработку». Увидеть Как использовать блочный шифр в Crypto ++ 4.x?

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector