我在Android应用程序中遇到AES解密问题。我已经搜索了很多但无法得到解决方案。
以下是我正在做的步骤。
来自服务器的加密信息也不相同,我们以加密格式发送的信息。 虽然在iPhone应用程序中完成了同样的事情,但iPhone能够成功解密信息。
我使用以下代码进行加密和解密。
public class AES256Cipher {
public static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
public static String AES_Encode(String str, String key) throws java.io.UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] textBytes = str.getBytes("UTF-8");
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
SecretKeySpec newKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = null;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
return Base64.encodeToString(cipher.doFinal(textBytes), 0);
}
public static String AES_Decode(String str, String key) throws java.io.UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] textBytes =Base64.decode(str,0);
//byte[] textBytes = str.getBytes("UTF-8");
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
SecretKeySpec newKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
return new String(cipher.doFinal(textBytes), "UTF-8");
}
请建议。
修改 我还有一件事,它适用于< 16位数信息。当我们输入16位数信息时,它会在解密时抛出异常。
答案 0 :(得分:3)
如果服务器遇到未映射到特定字符的未知编码,则密钥将无法正常传输并偶尔失败,从而导致密钥不正确。密文是使用base64编码的,所以可能没问题,但你的密钥可能不那么幸运。
请注意,密钥的任何更改或密文的最后一个块可能都会导致BadPaddingException
。