在Gingerbread下,在2.2上加密数据然后在2.3上尝试解密后,出现以下错误:
Caused by: javax.crypto.BadPaddingException: pad block corrupted
at org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(JCEBlockCipher.java:715)
at javax.crypto.Cipher.doFinal(Cipher.java:1090)
at com.citc.wallet.util.security.SimpleCrypto.decrypt(SimpleCrypto.java:63)
... 21 more
我发现一些帖子说SecureRandom在不同的系统下产生不同的结果:
BouncyCastle AES error when upgrading to 1.45
如何避免2.3出现此问题?
我可以以某种方式强制2.3使用相同的SecureRandom类吗?
我需要使用某种便携式加密方法吗?
解决方法:
答案是您根本不应该做自己正在做的事情.罪魁祸首:
sr.setSeed(seed);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
永远不要为密钥填充一些不可预测的随机值,因为稍后您将需要重新创建相同的精确密钥.这是来自android docs的一些关键内容
“seeding SecureRandom may be insecure”
Although it is common practice to seed
Random with the current time, that is
dangerous with SecureRandom since that
value is predictable to an attacker
and not appropriate for secure use.
无论如何,我知道您的论点将是您只是“填充”密钥,而执行操作的安全性并不重要.
如果您要接受192位或256位实现的128位密钥,则必须实现一种可重复的方法,将密钥扩展为192位或256位.如果愿意,您甚至可以将全0加到该键上,但是该键实际上是必须以某种方式完成该操作,以便您可以在每个系统上重复该操作.
无论如何,您可能还想考虑您正在做的事情可能会在Android以外的系统上使用.在这种情况下,应该选择使用更“便携式”的方法来扩展密钥.