Определить размер дешифрованных данных из 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

Когда вы выполняете дешифрование, вы берете значение последнего байта последнего блока и удаляете это количество байтов с конца.

Другие вопросы по тегам