Java默认的Crypto / AES行为

有谁知道默认的Javaencryption行为是什么:

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

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

对于Oracle JDK 7(已testing),AES的默认密码是AES / ECB / PKCS5Padding。 Java安全性文档没有提到这个(http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#algspec),必须做一些JUnittesting来找出。;

这些细节是提供程序特定的,依靠默认模式和填充可能是非常危险的。 如果您对目前与Java捆绑在一起的默认提供程序的价值感兴趣,则必须查找相关algorithm的源代码。 例如,它用于RSAalgorithm的默认值在这里 。 此外,“ Java™密码体系结构(JCA)参考指南”有相当多的信息可以回答您其他一些问题。

细节是提供者特定的。 JCA参考指南指出:

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

我总是使用完整的表单(algorithm/模式/填充),不仅因为我认为将这些“细节”留给实现是不好的做法,而且也是为了实现独立于所选提供者的密文(通常一个encryption存储/传输,那么不能确定相同的提供者将在以后/在另一端使用)。

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

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

javax.crypto.Cipher.getInstance(String transformation)工厂方法使用form algorithm / mode / padding的转换生成Ciphers。 如果省略了模式/填充,SunJCE和SunPKCS11提供程序将ECB用作默认模式,将PKCS5Padding用作许多对称密码的默认填充。

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

注意:ECB适用于单个数据块并且可以并行化,但通常不应该用于多个数据块。

因此,您不应该只使用AES而是指定模式和填充。 此外,虽然getInstance方法可以有另一个参数的提供者,这是不推荐,因为

应用程序绑定到其他Java实现上可能不可用的特定提供程序