0

私は 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

結果として復元されたテキストのサイズを判断する方法がわかりません。Working with cipher handlesリファレンスを確認しましたが、議論されていません (そして、'pad のヒットは 0 件です)。およびのlibgrcryptセルフ テストも確認しましたが、同じオーバーサイズのバッファが使用され、バッファが実際のサイズに切り詰められることはありません。tests/basic.ctests/fipsdrv.c

バッファに返されたデータのサイズを確認するにはどうすればよいrecoveredですか?

4

1 に答える 1

2

入力にパディング スキームを適用し、復号化後にパディングを削除する必要があります。gcrypt はそれを処理しません。

最も一般的な選択肢はPKCS#7です。大まかな概要は、最終ブロックの未使用のバイトを、パディングされたバイト数 ( block_size - used_bytes) で埋めることです。block_size入力の長さがブロック サイズの倍数である場合は、その後にバイトで満たされたブロックが続きます。

たとえば、8 バイトのブロックと 4 バイトの入力の場合、生の入力は次のようになります。

AB CD EF FF 04 04 04 04

復号化を行うときは、最後のブロックの最後のバイトの値を取得し、そのバイト数を末尾から削除します。

于 2015-03-04T01:58:21.493 に答える