Я хочу зашифровать входные данные блоками по 100 байт с помощью шифрования OpenSSL AES-256-cbc. Однако EVP_EncryptUpdate шифрует только 96 байтов (параметр tmp = 96). Следующий вызов EVP_EncryptUpdate зашифровывает остальные данные (за исключением тех, которые отсутствуют 4).
Расшифровка в порядке, кроме тех 4 пропущенных байтов.
Если я вызову EVP_EncryptUpdate только один раз и передам все данные сразу, все в порядке.
Я не понимаю, почему эти 4 байта отсутствуют, если я передаю только 100 байтов в EVP_EncryptUpdate.
std::string data = "A12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123hgfedcba";
unsigned char key[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
unsigned char iv[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
int i = 0, tmp = 0, ol = 0;
int res = EVP_EncryptInit(&ctx, EVP_aes_256_ecb(), key, iv);
std::unique_ptr<unsigned char[]> ret(new unsigned char[dataLen+EVP_CIPHER_CTX_block_size(&ctx)]);
for (i = 0; i < dataLen / 100; i++)
{
EVP_EncryptUpdate(&ctx,
&ret[ol], &tmp, &data[ol], 100);
ol += tmp;
}
if (dataLen % 100)
{
EVP_EncryptUpdate(&ctx, &ret[ol], &tmp, &data[ol], dataLen % 100);
ol += tmp;
}
EVP_EncryptFinal(&ctx, &ret[ol], &tmp);