2011-09-04 25 views
2

我正在使用AES加密/解密我的文件。我跟着this tutorial加密我的数据,但我稍微修改了一下代码,以便我可以使用相同的密钥来加密许多文件。Android AES问题

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

我在我的电脑上加密了文件,并试图在Android上解密它们。然而,我总是得到 BadPaddingException:垫块损坏。我打印出AES密钥,并发现使用相同的私钥,在PC和Android上解密的AES密钥是不同的

如果我在PC上解密相同的文件,它工作得很好。

为什么?

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

+0

如果你想回答你的问题,你应该包括你的代码的相关部分。 – Perception

+0

RSA是非确定性的(有一个随机组件),因此无论是在相同的平台还是不同的平台上,每个加密都应该得到不同的结果。 (尽管你应该可以用其他实现来解密它们。) –

+0

但我只加密了我的aes密钥ONCE ... – user538565

回答

2

您的RSA加密填充可能是在错误的填充方案

试试这个?

pkCipher = Cipher.getInstance("RSA/NONE/PKCS1Padding");

+0

我的天!有用!!!!!!!!!!!!!!!!!!!!!我一直在徒劳地搜寻几个小时。 muchas gracias – user538565

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 。你可能想告诉我们你想要达到的目标,你可能会以错误的方式去做。发明自己的密码协议并不是一个好主意。