8

我继承了使用以下密码的 Android 代码:

ks = new SecretKeySpec(key, "AES");
ciph = Cipher.getInstance("AES");

由于只给出了“AES”,我不知道密钥大小、模式和填充是什么。我查看了 Bouncy Castle* 文档,但找不到描述“AES”实例的位置。如果可以的话,我想使用更明确的实例描述(例如“AES/ECB/PCKS5Padding”)。

有谁知道这个实例的键大小、模式和填充是什么?

谢谢!

*我已经读到 Android 使用 Bouncy Castle 作为其默认提供程序,但我还没有发现任何官方的,所以我可能在这里做出无益的假设。

4

2 回答 2

5

Java 默认为"AES/ECB/PKCS5Padding"默认情况下,如 Oracle 文档所指定。

如果未指定模式或填充,则使用模式和填充方案的特定于提供程序的默认值。例如,SunJCE 提供程序使用 ECB 作为默认模式,PKCS5Padding 作为 DES、DES-EDE 和 Blowfish 密码的默认填充方案。这意味着对于 SunJCE 提供程序:

Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding"); and
Cipher c1 = Cipher.getInstance("DES"); are equivalent statements.

请参阅Oracle 文档中的创建密码对象


我刚刚自己使用调试器进行了检查。至少对于 Android 4.0,Android 似乎默认使用相同的加密和填充模式(如预期的那样)。使用单个 ( -valued) 字节的默认提供程序00的结果是一个填充的纯文本,其值000F0F0F0F0F0F0F0F0F0F0F0F0F0F0F以十六进制表示。这显然是 PKCS#5 填充,或者更准确地说是 PKCS#7 填充,它与16 字节块密码的PKCS#5 填充相同。


原则上,任何提供者都可以具有与默认“SunJCE”提供者不同的默认值。但是,这会破坏假设使用 Oracle / OpenJDK 默认值的应用程序。

与其让您的同事程序员一头雾水,强烈建议您指定整个字符串,包括模式和填充,并且不要依赖加密算法的默认值(SecureRandom通常不建议指定算法的地方除外)。

于 2012-12-08T00:17:52.853 回答
1

据我所知,在 java 中它代表AESin ECBmode without padding 。我认为它在android上是一样的。我建议您在 android 上运行一个简单的测试加密某些内容并AES/ECB/NoPadding使用 Java 或 android 对其进行解密。另外,如果您在此应用程序中没有看到任何 IV,那就是另一个,请指向这个方向。

于 2012-12-07T21:14:56.120 回答