質問: Diffie Hellmanメソッド(DH)でキーを生成すると、確立された共有キーは、使用されているプライムと同じサイズになります。 私が読んだ限り、これは古典的なDHのための少なくとも2000ビットでなければならない、いくつかはさらに言う。 しかし、通常256または512ビットが対称方式に必要です。 サイズを小さくするために確立されたキーをハッシュするだけで十分だと聞いていますが、キー導出関数を使用するものもあります。 今、これを行う標準的な方法は何ですか? また、キー導出関数を使用する方が安全ですか? 使用するメソッドの名前を付けることができれば、私はそのようなメソッドの詳細を読むことができたと思います。
回答: Diffie-Hellmanは、2人の当事者が秘密の値を生成することを許可します。秘密の値は、通信の観察から再構築できません。鍵交換に起因する秘密値の大きさ(*グラム**AB* MOD *P*)はと*B*が選択される場合は、そのエントロピーが小さくてもよい、実際プライムと同じサイズであります小さな空間でおよび*b*を結果の秘密値である256ビットの乱数gives you 128-bit securityにピッキングすること。 結果として得られる秘密の値は、何らかの数学的構造を持つため、そのまま使用しないでください。代わりに、ハッシュしてその結果を対称キーとして使用する必要があります。より正確には、共有秘密をkey derivation functionへの入力として使用する必要があります。 *パスワードベースの*キー導出関数:秘密値は十分なエントロピーを持ち、強化する必要はなく、伸ばすだけです。 RFC 2631は、共有秘密の鍵材料を導出する方法を指定する:SHA-1(ZZは|| CTRを入力||)ZZは、共有秘密のバイト符号化である場合、タイプは、誘導されている材料の種類を示していますctrはカウンタのバイトエンコーディングです。 SHA-1の代わりにSHA-256やSHA-512などの別のハッシュ関数を使用することは明らかです。 2人の当事者が合意している限り、鍵素材が正確に導出される方法は実際には重要ではありません。たとえば、256ビットしか必要ない場合は、SHA-256(ZZ)はOKです。カウンタをタックするポイントは、ハッシュ関数の1つの実行が提供できるものより多くを必要とするときです。プロトコルを将来的に証明するために、RFCに従うことをお勧めします。現在1つのキーのみを派生させる必要がある場合は、タイプとカウンタの対応するASN.1エンコーディングをアプリケーションの文字列リテラルとしてハードコーディングできます。 実際には、using the DH shared secret directlyは“not too bad”です。にもかかわらず、あなたはKDF(少なくともハッシュ)でそれを絞っておく必要があります:それは簡単で、速く、より安全で、より標準的で、より将来性のあるものです。