Java默认加密/ AES行为

时间:2011-06-06 21:07:12

标签: java cryptography aes

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

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

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

4 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:10)

这些细节是提供者特定的,依赖于默认模式和填充可能非常危险。如果您对当前与Java捆绑的默认提供程序使用的值感兴趣,则必须搜索相关算法的源代码。例如,它用于RSA算法的默认值是here。此外,Java™ Cryptography Architecture (JCA) Reference Guide有相当多的信息可以回答你们其他一些问题。

答案 2 :(得分:9)

细节是提供者特定的。 JCA Reference Guide说:

  

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

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

答案 3 :(得分:0)

这取决于提供商。不同的提供商可能有不同的默认参数这是Java 8的链接。

https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SUNProvider

  

javax.crypto.Cipher.getInstance(String transformation)工厂   method使用表单的转换生成密码   算法/模式/填充。如果省略模式/填充,则为SunJCE   和SunPKCS11提供程序使用ECB作为默认模式和PKCS5Padding   作为许多对称密码的默认填充。

     

建议使用完全指定的转换   算法,模式和填充,而不是依赖于默认值。

     

注意:ECB适用于单个数据块,可以   并行化,但一般不应该用于多个块   数据

因此,您不应该只使用AES,而是指定模式和填充。此外,虽然getInstance方法可以为提供程序提供另一个参数,但不建议这样做,因为

  

应用程序与可能无法使用的特定提供程序相关联   在其他Java实现上