有谁知道默认的Java加密行为是什么:
SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES");
Cipher localCipher = Cipher.getInstance("AES");
具体来说,我希望了解这些类如何生成IV,以及仅指定“AES”时的默认加密模式是什么。感谢。
答案 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实现上