Определить размер дешифрованных данных из gcry_cipher_decrypt?
Я использую AES/GCM, но следующий вопрос является общим для других режимов, таких как AES/CBC. У меня есть следующий звонок в libgcrypt
:
#define COUNTOF(x) ( sizeof(x) / sizeof(x[0]) )
#define ROUNDUP(x, b) ( (x) ? (((x) + (b - 1)) / b) * b : b)
const byte cipher[] = { 0xD0,0x6D,0x69,0x0F ... };
byte recovered[ ROUNDUP(COUNTOF(cipher), 16) ];
...
err = gcry_cipher_decrypt(
handle, // gcry_cipher_hd_t
recovered, // void *
COUNTOF(recovered), // size_t
cipher, // const void *
COUNTOF(cipher)); // size_t
Я не могу понять, как определить размер полученного восстановленного текста. Я проверил ссылку Работа с дескрипторами шифра, и она не обсуждалась (а для 'pad' было 0 совпадений). Я также проверил libgrcrypt
самопроверка в tests/basic.c
а также tests/fipsdrv.c
, но они используют один и тот же увеличенный буфер и никогда не сокращают его до фактического размера.
Как определить размер данных, возвращаемых мне в recovered
буфер?
1 ответ
Вам нужно применить схему заполнения к вашему входу и удалить заполнение после расшифровки. gcrypt не справится с этим для вас.
Самый распространенный выбор - PKCS # 7. Общий обзор заключается в том, что вы заполняете неиспользуемые байты в вашем последнем блоке количеством заполненных байтов (block_size - used_bytes
). Если ваша длина ввода кратна размеру блока, вы следуете за ним с блоком, заполненным block_size
байт.
Например, с 8-байтовыми блоками и 4 байтами ввода ваш необработанный ввод будет выглядеть так:
AB CD EF FF 04 04 04 04
Когда вы выполняете дешифрование, вы берете значение последнего байта последнего блока и удаляете это количество байтов с конца.