正如 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 不保证您在提供相同种子时将获得相同的输出。如果您仔细查看Javadocs,您会发现它尽可能地尝试从其他来源提供一些真实的熵。
编辑1:
感谢 owlstead 在审查答案时一贯的彻底。有关其他讨论,请参阅他对相关问题的回答。SHA1PRNG 的源代码可在此处在线获取。这有点棘手,但是如果您在向实例询问任何随机字节之前提供种子,那么输出将是完全确定的。所以我之前的说法是不正确的。