Java 默认加密/AES 行为

2022-09-01 05:52:52

有谁知道默认的Java加密行为是什么:

SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES");
Cipher localCipher = Cipher.getInstance("AES");

具体来说,我希望了解这些类如何生成IV,以及仅指定“AES”时的默认加密模式是什么。谢谢。


答案 1

对于 Oracle JDK 7(已测试),AES 的默认密码是 AES/ECB/PKCS5Padding。Java安全文档没有提到这一点(http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#algspec),必须做一些JUnit测试才能找到答案。


答案 2

详细信息是特定于提供程序的。JCA参考指南说:

(创建密码对象)如果未指定模式或填充,则使用特定于提供程序的模式和填充方案的默认值。例如,SunJCE 提供程序使用 ECB 作为默认模式,使用 PKCS5Padding 作为 DES、DES-EDE 和 Blowfish 密码的默认填充方案。这意味着在 SunJCE 提供程序的情况下:Cipher.getInstance(“DES”) 和 Cipher.getInstance(“DES/ECB/PKCS5Padding”) 是等效的语句。

我总是使用完整的形式(算法/模式/填充),不仅因为我认为在实现中省略这样的“细节”是不好的,而且对于实现独立于所选提供程序的密文(通常加密用于存储/传输,然后无法确定以后/在另一端将使用相同的提供程序)。


推荐