15

私は Android で PBE 用の AES 暗号化エンジンを実装しています。IV の作成を実装する 2 つの方法を見つけましたIvParameterSpec

方法 #1:

SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);

IvParameterSpec ivParams = new IvParameterSpec(iv);

方法 #2:

AlgorithmParameters params = cipher.getParameters();
byte[] iv2 = params.getParameterSpec(IvParameterSpec.class).getIV();

ivParams = new IvParameterSpec(iv2);
4

1 に答える 1

19

Java API ではCipher.init()、暗号化/復号化モードとキーのみを使用する API に対して次のように指定されているため、メソッド #1 を使用します。

この暗号インスタンスが、指定されたキーが提供できないアルゴリズム パラメーターまたはランダム値を必要とする場合、この暗号の基になる実装は、必要なパラメーターを (そのプロバイダー または ランダム値を使用して) 生成することになっています。

(強調鉱山)。

そのため、方法 2が選択された場合に、さまざまなプロバイダーが何を行うかは明確ではありません。Android ソース コードを見ると、少なくとも一部のバージョン (バージョン 21 を含む?)ではランダム IV が作成されないようです- ランダム IV 作成はコメント アウトされているようです。

方法 1 もより透過的であり、私の意見では、目に優しいです。


new SecureRandom()一般的には、どの RNG が最適かをシステムに判断させて使用する方がよいことに注意してください。"SHA1PRNG"は明確に定義されておらず、実装によって異なる可能性があり、特にAndroidでは実装上の弱点があったことが知られています。


したがって、最終結果は次のようになります。

SecureRandom randomSecureRandom = new SecureRandom();
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);

GCM モードは、AES のブロック サイズである 16 バイトの IV ではなく、12 バイトの IV で最適に機能することに注意してください。

于 2015-03-25T22:39:46.250 に答える