1

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なの?

4

2 に答える 2

1

ここにあるのは、独自の Password Based Key Derivation Function (PBKDF) です。この関数は、キーの強化またはキーのストレッチを許可するようですが、キーの拡張は許可しないようです。

このキーが完全にランダムでない場合、キーの強化を使用して、キーの値 (またはパスワードの値) をブルート フォースすることをより困難にすることができます。これは、暗号化ハッシュ関数内の IV (実際にはsalt ) とキーを使用するループによって実装されます。20 バイトを受信した場合、160 ビットの出力があるため、SHA-1 である可能性があります。

キー拡張は、アルゴリズムによって提供されません。キー拡張は、あなたが見ているものです: 計算された乱数を X 個のビットに分散させます。比較的簡単に実装できます。おそらく最善の方法は、HKDF の鍵拡張アルゴリズムを調べることです。

ただし、現在、スキームは PBKDF 内のハッシュの出力によって制限されています。もちろん、SHA-256 を使用する場合は、1 つのAES-256 キーに対して十分なエントロピーが得られます。または、暗号化ごとに異なるソルトを使用する場合は、SH-384 を使用して AES-256 キーを導出し、残りのビットを IV (暗号化用) として使用できます。

キー ストレッチングという用語は、常に同じ意味で使用されるわけではないことに注意してください。

于 2014-09-14T11:49:00.683 に答える