Java默认加密/ AES行为

wun*_*tee 32 java cryptography aes

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

SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES");
Cipher localCipher = Cipher.getInstance("AES");
Run Code Online (Sandbox Code Playgroud)

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

bra*_*tan 34

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

  • 我可以确认,当仅请求"AES"时,1.6.0_31也使用"AES/ECB/PKCS5Padding".通过加密~10MB的`/ dev/urandom`各种组合来测试. (3认同)
  • @Jesse - `Cipher.getAlgorithm()`应该返回你正在使用的内容.请参阅Java的[标准算法名称文档](http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html). (2认同)

laz*_*laz 11

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


Jav*_*ier 11

细节是提供者特定的.在JCA参考指南说:

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

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


小智 5

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

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

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

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

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

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

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