Android中"AES"密码的含义?

bra*_*ves 8 android cryptography aes

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

ks = new SecretKeySpec(key, "AES");
ciph = Cipher.getInstance("AES");
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

*我读过Android使用Bouncy Castle作为其默认提供商,但我没有发现任何官方的,所以我可能在这里做一个无益的假设.

Maa*_*wes 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.
Run Code Online (Sandbox Code Playgroud)

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


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


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

强烈建议不要让您的同事程序员一无所知,而是强烈建议指定包括模式和填充在内的整个字符串,并且不要依赖加密算法的默认值(除了SecureRandom,通常不建议指定算法)。