PolarSSL パッケージで提供されるcrypt_and_hash の例に基づいたセキュリティを持つアプリケーションを作成しています。この例では、crypt_and_hash はキー (コマンドライン引数で指定) とランダムな 16 バイトの IV を受け取ります。次に、それらを8192回まとめて文字化けします(理由はわかりませんが、それは問題外です):
memset( digest, 0, 32 );
memcpy( digest, IV, 16 );
for( i = 0; i < 8192; i++ )
{
md_starts( &md_ctx );
md_update( &md_ctx, digest, 32 );
md_update( &md_ctx, key, keylen );
md_finish( &md_ctx, digest );
}
次に、出力を取得し、cipher_setkey を介して暗号コンテキストにキーを設定するために is を使用します。これは、後ですべての暗号化/復号化操作を実行するために使用されます。
if( cipher_setkey( &cipher_ctx, digest, cipher_info->key_length,
POLARSSL_ENCRYPT ) != 0 )
crypt_and_hash がダイジェストを作成するとき、暗号化スキームと提供されたキーのサイズに関係なく、バッファーに 20 バイトのみを設定し、その後に 12 の null バイトを設定することに気付きました。それをテストするために、さまざまなスキームとキーサイズを試しました。鍵のサイズは暗号化に従うべきではありませんか (たとえば、AES-256 の場合は 32 バイト、AES-128 の場合は 16 バイト)。なんでいつも20なの?