我正在尝试解密字符串 "~9?8?m???=?T?G"
我从后端服务器收到的字符串,该服务器使用 OpenSSL 使用 AES-256-CBC 加密字符串。有代码块:
public static String decryptText(String textToDecrypt) {
try {
byte[] base64TextToDecrypt = Base64.encodeBase64(textToDecrypt.getBytes("UTF-8"));
byte[] guid = "fjakdsjkld;asfj".getBytes("UTF-8");
byte[] iv = new byte[16];
System.arraycopy(guid, 0, iv, 0, guid.length);
IvParameterSpec ips = new IvParameterSpec(iv);
byte[] secret = DECRYPTION_SECRET_HASH.getBytes("UTF-8");
SecretKeySpec secretKey = new SecretKeySpec(secret, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// decryption pass
cipher.init(Cipher.DECRYPT_MODE, secretKey, ips);
byte[] converted = cipher.doFinal(base64TextToDecrypt);
System.out.println(new String(converted));
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "Decipher error for " + textToDecrypt, e);
}
return "";
}
不幸的是,当我到达
byte[] converted = cipher.doFinal(base64TextToDecrypt);
语句抛出以下异常:
javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
有任何想法吗?
原文由 lazypig 发布,翻译遵循 CC BY-SA 4.0 许可协议
您应该在方法的开头对字符串进行 _解码_,而不是对字符串的平台特定表示形式进行编码。
或者更准确地说:
如果您正确命名变量。
一般来说,每次你(觉得你必须)使用
String.getBytes(): byte[]
方法或String(byte[])
构造函数时,你可能做错了什么。您应该首先考虑您要尝试做什么,如果 确实 需要使用它,请指定 字符编码。在您的情况下,
converted
变量中的输出可能是字符编码的。所以你可以使用以下片段:而不是你现在拥有的。