我继承了使用以下密码的Android代码:
ks = new SecretKeySpec(key, "AES");
ciph = Cipher.getInstance("AES");
由于只给出了“AES”,我不知道密钥大小,模式和填充是什么。我查看了Bouncy Castle *文档,但我找不到描述“AES”实例的位置。如果可以的话,我想使用更明确的实例描述(例如“AES / ECB / PCKS5Padding”)。
有谁知道这个实例的密钥大小,模式和填充是什么?
谢谢!
*我读过Android使用Bouncy Castle作为其默认提供商,但我没有发现任何官方的,所以我可能在这里做出一个无益的假设。
答案 0 :(得分:4)
默认情况下,Java默认为"AES/ECB/PKCS5Padding"
,由Oracle文档指定。
如果未指定模式或填充,则提供者特定的默认值 用于模式和填充方案。例如,SunJCE provider使用ECB作为默认模式,并将PKCS5Padding作为默认模式 DES,DES-EDE和Blowfish密码的填充方案。这意味着 就SunJCE提供商而言:
Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding"); and Cipher c1 = Cipher.getInstance("DES"); are equivalent statements.
请参阅Oracle文档中的creating a Cipher object。
我刚刚使用调试器进行了检查。至少对于Android 4.0,似乎Android默认采用相同的加密和填充模式(如预期的那样)。使用单个(00
- 值)字节的默认提供程序的结果是填充的纯文本,其值为000F0F0F0F0F0F0F0F0F0F0F0F0F0F0F
,以十六进制表示。这显然是PKCS#5填充,或者对于16字节分组密码更正确PKCS#7 padding which is the same padding as PKCS#5。
答案 1 :(得分:1)
据我所知,在java中,它代表AES
模式ECB
中的without padding
。而且我认为它在Android上是一样的。我建议你运行一个简单的测试加密android上的东西,并使用Java或android使用AES/ECB/NoPadding
解密它。另外,如果你在这个应用程序中没有看到任何IV,那么就是另一个,指向这个方向。