我有一个在桌面计算机上运行的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.comprivate 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;
}