5

この init が成功する理由:

Cipher AESCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
AESCipher.init(Cipher.ENCRYPT_MODE, secretKey, secRandom);

これは失敗しますが:

Cipher AESCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
AESCipher.init(Cipher.DECRYPT_MODE, secretKey, secRandom);

スレッド「メイン」で例外をスローする java.security.InvalidKeyException: パラメータがありません

secretKey は KeyGenerator によって生成され、secureRandom はランダムな静的シード セットを使用して SecureRandom.getInstance("SHA1PRNG") によって生成されます。

ありがとう

4

2 に答える 2

5

CodeInChaos で正しく推測されているように、SecureRandom インスタンスは、AESCipherインスタンスが で作成されたときにランダム IV を導出するために使用されますCipher.ENCRYPT_MODE。ただし、復号化モードで Cipher インスタンスを作成するときに、パラメーターとして指定します。この小さな無意味なコード フラグメントは、例を示しています。

public static void main(String[] args) throws Exception {
    SecureRandom secRandom = SecureRandom.getInstance("SHA1PRNG");
    KeyGenerator kg = KeyGenerator.getInstance("AES");
    kg.init(128, secRandom);
    Key secretKey = kg.generateKey();
    Cipher AESCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    AESCipher.init(Cipher.ENCRYPT_MODE, secretKey, secRandom);
    IvParameterSpec iv = new IvParameterSpec(AESCipher.getIV());
    AESCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    AESCipher.init(Cipher.DECRYPT_MODE, secretKey,iv, secRandom);
}

また、 SecureRandom インスタンスを静的シードで初期化しているという主張は、そのクラスの誤解を示唆しています。SecureRandom は、同じシードを提供したときに同じ出力が得られることを保証しません。Javadocを注意深く見ると、可能であれば他のソースから真のエントロピーを提供しようとしていることがわかります。

編集1:

回答をレビューする際の彼のいつもの徹底的さのために owlstead に感謝します。追加の議論については、関連する質問に対する彼の回答を参照してください。SHA1PRNG のソース コードは、こちらからオンラインで入手できます。従うのは少し難しいですが、インスタンスにランダムなバイトを要求する前にシードを提供すると、出力は完全に決定論的になります。したがって、私の以前の発言は正しくありません。

于 2013-01-02T19:37:51.310 に答える
2

適用しているSecureRandom を使用して init メソッドの JavaDoc を読むだけです。

この暗号が、指定されたキーから導出できないアルゴリズム パラメータを必要とする場合、基になる暗号実装は、暗号化またはキー ラッピングのために初期化されている場合、(プロバイダ固有のデフォルト値またはランダム値を使用して) 必要なパラメータ自体を生成することになっています。InvalidKeyException復号化またはキーのラップ解除のために初期化されている場合は例外を発生させます。getParameters生成されたパラメーターは、またはgetIV (パラメーターが IV の場合)を使用して取得できます。

暗号化された IV を復号化メソッドに転送する必要があります (たとえば、暗号化テキストの前に追加するなど)。IV は平文で転送される場合があります。復号化用の IV を設定するIvParameterSpec代わりに使用します。SecureRandom

于 2013-01-03T17:48:52.627 に答える