Android AES问题

时间:2011-09-04 13:03:29

标签: java android aes

我想用AES加密/解密我的文件。我跟着this tutorial来加密我的数据,但我稍微修改了一下代码,这样我就可以使用相同的密钥来加密许多文件了。

除了加密我的文件外,我的AES密钥也使用RSA(this page,saveKey()方法)保存。

我在PC上加密了文件,并试图在Android上解密它们。但是,我总是得到 BadPaddingException:pad block corrupted 。我打印出AES密钥,发现使用相同的私钥,解密的AES密钥在PC和Android上不同

如果我在PC上解密相同的文件,它工作正常。

为什么?!

Android的密码有什么问题吗?!需要帮助。

2 个答案:

答案 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。您可能想告诉我们您要实现的目标,您可能会采用错误的方式。发明自己的加密协议很少是一个好主意。