web-dev-qa-db-ja.com

Diffie-Hellmanで確立されたキーのサイズを縮小するにはどうすればよいですか?

Diffie Hellman法(DH)を使用して鍵を生成すると、確立された共有鍵は、使用される素数と同じサイズになります。私が読んだ限りでは、これは古典的なDHでは少なくとも2000ビットであるはずですが、それ以上と言う人もいます。

ただし、対称スキームには通常256ビットまたは512ビットが必要です。

サイズを小さくするには、確立されたキーをハッシュするだけで十分だと聞きましたが、キー導出関数を使用するものもあります。

今、私はこれを行うための標準的な方法は何ですか?また、鍵導出関数を使用する方が安全ですか?

使用されているメソッドに名前を付けていただければ幸いです。そのようなメソッドについて詳しくお読みいただければ幸いです。

4
Raphael Ahrens

Diffie-Hellmanを使用すると、2つのパーティが、通信を観察しても再構築できない秘密の値を生成できます。鍵交換から生じる秘密値のサイズ(ga b modp)は確かに素数と同じサイズですが、aおよびbはより小さなスペースで選択されます。 abを256ビットの乱数に選択 128ビットのセキュリティを提供 結果として得られる秘密の値。

原則として、結果の秘密の値にはいくつかの数学的構造があり、そのまま使用しないでください。代わりに、それをハッシュして、結果を対称鍵として使用する必要があります。より正確には、共有秘密を 鍵導出関数 への入力として使用する必要があります。 パスワードベースの鍵導出関数ではありません。秘密値には十分なエントロピーがあり、強化する必要はなく、拡張するだけです。

RFC 2631 共有シークレットからキーマテリアルを派生させる方法を指定します。SHA-1(ZZ ||タイプ|| ctr)ここで、ZZは共有シークレットのバイトエンコーディングであり、タイプはマテリアルの種類を示します。が導出されており、ctrはカウンタのバイトエンコーディングです。 SHA-1の代わりにSHA-256やSHA-512などの別のハッシュ関数を使用しても問題ありません。

両者が同意する限り、主要な資料が導き出される正確な方法は実際には重要ではありません。たとえば、256ビットのみが必要な場合は、SHA-256(ZZ)で問題ありません。カウンターに取り組むポイントは、ハッシュ関数の1回の実行で提供できる以上のものが必要な場合です。プロトコルの将来を保証するために、RFCに従うことをお勧めします。ここで1つのキーのみを導出する必要がある場合は、タイプとカウンターの対応するASN.1エンコーディングを、アプリケーションで文字列リテラルとしてハードコーディングできます。

実際には、 DH共有シークレットを直接使用「それほど悪くない」 であることがわかります。それでも、KDFを介してそれを絞る必要があります(少なくともハッシュします)。簡単、迅速、安全、標準的、そして将来性があります。