5

私は、 RFC 3526のいくつかの大きなグループを使用して、JavaでDiffie-Hellman鍵交換を実装しました。私の出力はかなり大きなバイト配列です。出力の最初の448ビット(56バイト)をblowfishキーに使用しても安全ですか?バイトを何らかの方法で変換する必要がありますか、それともキーに特定のバイトを選択する必要がありますか?

4

2 に答える 2

3

理論的な観点から、いいえ、それは安全ではありません。実際の攻撃を特定できたわけではありません。ただし、Diffie-Hellman鍵交換の出力は、q個の要素で構成され、最大でsqrt(q)セキュリティを提供するグループの要素です。その要素のエンコーディングの一部を切り捨てることは良い考えのようには見えません...

「適切な」方法は、一方向の鍵導出関数を使用することです。簡単に言うと、Diffie-Hellman出力をSHA-256などの優れたハッシュ関数で処理し、ハッシュ結果をキーとして使用します。Diffie-Hellmanステップに関しては、ハッシュ時間はごくわずかです。JavaにはすでにSHA-256とSHA-512の優れた実装が含まれており、非常に古いJava実装(たとえば、Internet Explorer5.5に付属していたMicrosoftJVM)との互換性が必要な場合は、SHA-2の独立したJava実装を使用できます。sphlibにあるものなど。または、仕様から再実装することもできます(難しいことではありません):FIPS 180-3(PDFファイル)

キーに128ビット以上が必要な場合、これは2050年頃からのタイムトラベラーであることを意味します。適切な対称暗号化スキームを使用していると仮定すると、当面は128ビットで十分です。

そういえば、Blowfishはもうお勧めできません。64ビットブロックがあり、暗号化されたデータの長さが数ギガバイトに達すると問題が発生します。これは、現在ではそれほど大きくないサイズです。AESなどの128ビットブロック暗号を使用することをお勧めします。また、深刻な対称暗号化システムでは、キー付きの整合性チェックが必要になります。これは、HMACなどのMAC(メッセージ認証コード)を使用して実行できます。HMAC自体はハッシュ関数上に構築されています(これも簡単に実装でき、sphlibにはJava実装があります)。または、さらに良いことに、AESを暗号化/ MACモードの組み合わせで使用すると、トリッキーな詳細が処理されます(ブロック暗号を適切に使用するのは簡単ではないため)。CWCGCMを検索する(どちらも特許はありません。後者はNISTによって承認されています)。

于 2010-10-06T12:02:22.597 に答える
0

提案するソリューションは、Diffie-Hellman交換の最上位ビットがハードコアであるかどうかによって異なります。最上位ビットが予測できないことを示すいくつかの小さな結果が知られていますが、あなたのアプローチが正しいことを示すのに十分強力な論文を私は知りません。

ただし、Diffie-Hellman鍵からの鍵導出についてはいくつかの提案があります。たとえば、素敵な紙はNISTSP800-135です。これまでのところ、これはドラフトにすぎず、ここで見つけることができます。ただし、いくつかの既存の標準を確認します。もちろん、標準を使用して自分で開発することをお勧めします。

Thomas Porninの提案は合理的に見えますが、それでもアドホックな解決策です。そして安全を期すために、おそらくそれを使用すべきではありません。むしろ、分析されたものを使用します(たとえば、TLSバージョン1.2で使用される鍵導出スキーム)。

于 2010-10-13T08:56:20.420 に答える