android-AES姜饼

This是我的AES代码.

在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以外的系统上使用.在这种情况下,应该选择使用更“便携式”的方法来扩展密钥.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...