在Android上使用Sun Crypto Provider加密的解密文件(AES)

时间:2011-02-25 14:26:55

标签: android

我有一个在桌面计算机上运行的Java应用程序。它使用AES加密和解密其文档。当我使用桌面版加密文件,并在Android模拟器中解密时,解密失败。 cipher.doFinal行抛出此异常:javax.crypto.BadPaddingException:pad block corrupted。

桌面版运行时,它使用Sun加密提供程序。当Android版本运行时,它使用BouncyCastle提供程序。我意识到对Cipher.getInstance的调用只是指定算法(“AES”)。我试图指定算法,模式和填充方案。例如,Cipher.GetInstance(“AES / ECB / PKCS5Padding”),但是,我还没有确定Sun加密提供程序和BouncyCastle之间兼容的模式和填充方案。

我意识到我可以简单地将BouncyCastle与我的应用程序捆绑在一起,并在桌面和Android中使用它,但我不愿意。我还想避免解决这个问题,迫使桌面程序的用户将加密文件转换为适用于Android的格式。

我的问题是:如何在Android上成功解密使用Sun加密提供程序加密的文件?

此致

Eric Bergman-Terrell www.EricBT.com

private static byte[] getPasswordMessageDigest(String password) throws NoSuchAlgorithmException {
    MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
    byte[] passwordMessageDigest = messageDigest.digest(password.getBytes());

    return passwordMessageDigest;
}

public static SecretKey createSecretKey(String password) throws NoSuchAlgorithmException, InvalidKeySpecException {
    byte[] passwordMessageDigest = getPasswordMessageDigest(password);

    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    secureRandom.setSeed(passwordMessageDigest);

    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(128, secureRandom);

    SecretKey secretKey = keyGenerator.generateKey();

    return secretKey;
}

public static byte[] encrypt(String password, byte[] plainText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeySpecException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    Cipher cipher = Cipher.getInstance("AES");

    SecretKey secretKey = createSecretKey(password);

    cipher.init(Cipher.ENCRYPT_MODE, secretKey);

    byte[] cipherText = cipher.doFinal(plainText);

    return cipherText;
}

public static byte[] decrypt(String password, byte[] cipherText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeySpecException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    Cipher cipher = Cipher.getInstance("AES");

    SecretKey secretKey = createSecretKey(password);

    cipher.init(Cipher.DECRYPT_MODE, secretKey);

    byte[] plainText = cipher.doFinal(cipherText);

    return plainText;
}

0 个答案:

没有答案