Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java默认加密/AES行为_Java_Cryptography_Aes - Fatal编程技术网

Java默认加密/AES行为

Java默认加密/AES行为,java,cryptography,aes,Java,Cryptography,Aes,是否有人知道默认Java加密行为的用途: SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES"); Cipher localCipher = Cipher.getInstance("AES"); 具体来说,我希望了解这些类是如何生成IV的,以及在指定“AES”时默认的加密模式是什么。谢谢。这些详细信息是特定于提供商的,依赖默认模式和填充可能非常危险。如果您对当前与Java捆绑在一起的默认提供程序使用的值感

是否有人知道默认Java加密行为的用途:

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

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

这些详细信息是特定于提供商的,依赖默认模式和填充可能非常危险。如果您对当前与Java捆绑在一起的默认提供程序使用的值感兴趣,那么您必须查找相关算法的源代码。例如,它用于RSA算法的默认值为。另外,还有很多信息可以回答其他一些问题。

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

详细信息是特定于提供商的。报告说:

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


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

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

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

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

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

因此,您不应该只使用AES,而应该指定模式和填充

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


请不要引用我的话,但这很容易取决于提供商。你真的希望始终指定操作模式和填充算法。不这样做可能会导致太多问题…你真的能接受其中一个答案吗?你最近的问题来自不久前,所以你应该还在。我可以确认at 1.6.0_31在仅请求
AES
时也使用
AES/ECB/PKCS5Padding
。通过加密~10MB的
/dev/uradom
各种组合进行测试。我已经搜索了几个小时了!谢谢!@Jesse-
Cipher.getAlgorithm()
应该返回您正在使用的内容。请参阅Java的。非常感谢您。我已经为此寻找了几个小时的解决方案。如果您想在C中解密用Java加密的内容,请不要忘记将块大小设置为
128
,因为Java遵循特定的AES标准。@jww
Cipher.getAlgorithm()
仍然返回“AES”按此请求时(OpenJDK 11)。变量
com.sun.crypto.provider.CipherCore.cipher
padding
显示执行
doFinal
时的实际设置。这应该是可接受的答案,因为它链接到文档中提到的确切位置。不幸的是,我没有检查所有答案,所以我花了一段时间才找到该段落在Java6文档版本中没有,但从Java7开始就有了。