2009-11-23 15 views
14

この質問には答えが1つだけではなく、一般的なアプローチを見つけようとしています。どのように初期化ベクトルを生成する必要がありますか?

Java 1.4.2を使用すると、対称アルゴリズムで使用するためにキーとIVを生成する必要があります。これらの値は、安全なチャネルを通じて受信者と事前に共有されます。

KeyGenerator.keyGenerate()で生成できるキーです。しかし、私がそれを紛失していない限り、ランダムIVを生成する機能はありません。

メモリからランダムな16バイトを引き出すのと同じように、何かを完全に行う必要がありますか?または、十分にランダムな初期化ベクトルを生成するための好ましい方法がありますか?

ご了承ください。いくつかの実装のために

答えて

7

SecureRandomクラスが真の乱数を生成することによってあなたを助けるでしょうが:

多くのSecureRandomの実装は、彼らを意味し、擬似乱数 ジェネレータ(PRNG)の形式で あります確定的なアルゴリズム を使用して、 ランダムシードから 疑似ランダムシーケンスを生成します。 は、真の乱数を生成することができ、さらに は、 の両方の技法の組み合わせを使用することができる。

getProvider()getAlgorithm()の2つの方法があり、どの実装が使用されているかについての情報があります。 this pageから、疑似乱数ジェネレータSHA1PRNG(真のランダムデータがシードされている)は、それらの1つ、または現在利用可能な唯一のものであるようです。

+1

@schnaader - nit-pick - SHA1PRNGは真のRNGではありません。これは真のランダムシードを(あなたがリンクしたページに従って)PRNGです。 –

+0

あなたは正しいです、答えを編集しました。 – schnaader

13

暗号を使用しているモードによって異なります。 CBCを使用している場合は、からのバイトが最も簡単で、おそらく最も安全で&hellipですが、あなたのRNGが良好である限りです。

ほとんどのJavaプロバイダは、必要なパラメータを自動的に生成しますが、選択されたものを把握するためには、暗号とモードを理解する必要があります。これは、プロバイダがIV自体を生成するのに適した方法を選択することができます

cipher.init(Cipher.ENCRYPT_MODE, secret); 
IvParameterSpec spec = 
    cipher.getParameters().getParameterSpec(IvParameterSpec.class); 
byte[] iv = spec.getIV(); 

:あなたはIVを必要とするモードを使用している場合たとえば、あなたはこのような何かをしたいです。しかし、ECBモードを使用する暗号で同じ方法を使用する場合、それは失敗します。

カウンタモードを使用すると、明らかにカウンタの再使用を避けるために十分な注意が必要です。

6

他の答えが示すように、安全な乱数ジェネレータを使用してIVを作成します。

しかし、ちょっとしたこととして、IVを安全なチャンネルで送信する必要はありません。メッセージにメッセージを追加するのが普通です。 よりもが重要であることを覚えておいてください。それぞれのメッセージに新しいIVを使用することは、IVを秘密にするよりも重要です。キーと同時にIVを事前共有することは、IVを再使用する(悪い)か、送信可能なメッセージ数に制限があることを意味します。

1

GUIを使用している場合や、ユーザーデータ入力ハードウェアへのシステムコール(マウスが優先されている)にアクセスできる場合は、ユーザーがマウスポインターの座標のペアを作成することができます。それらをいくつかの文字列に追加します。文字列上の好きなハッシュ関数を使って、高いエントロピーで完全にランダムなIVを作成するよりも、

関連する問題