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 のソース コードは、こちらからオンラインで入手できます。従うのは少し難しいですが、インスタンスにランダムなバイトを要求する前にシードを提供すると、出力は完全に決定論的になります。したがって、私の以前の発言は正しくありません。