我想用AES加密/解密我的文件。我跟着this tutorial来加密我的数据,但我稍微修改了一下代码,这样我就可以使用相同的密钥来加密许多文件了。
除了加密我的文件外,我的AES密钥也使用RSA(this page,saveKey()方法)保存。
我在PC上加密了文件,并试图在Android上解密它们。但是,我总是得到 BadPaddingException:pad block corrupted 。我打印出AES密钥,发现使用相同的私钥,解密的AES密钥在PC和Android上不同。
如果我在PC上解密相同的文件,它工作正常。
为什么?!
Android的密码有什么问题吗?!需要帮助。
答案 0 :(得分:3)
你的RSA填充密码可能是错误的填充方案
试试这个吗?
pkCipher = Cipher.getInstance("RSA/NONE/PKCS1Padding");
答案 1 :(得分:1)
您复制的代码是错误的。它取决于Android版本可能有效,也可能无效。我的猜测是它不适用于新的。从种子转换为原始密钥的部分存在缺陷(见下文):SecureSeed.setSeed()
不保证设置随机生成器状态,它只是添加它。这意味着您无法保证获得相同的密钥。要根据密码可靠地获取相同的密钥,您需要使用PBE(基于密码的加密)
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
// this is wrong!
sr.setSeed(seed);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
通常,首先确保您可以使用AES可靠地加密/解密,然后您可以继续使用RSA。您可能想告诉我们您要实现的目标,您可能会采用错误的方式。发明自己的加密协议很少是一个好主意。