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
通常不建议指定算法的地方除外)。