javax.crypto.IllegalBlockSizeException : last block incomplete in decryption - Decrypting an encrypted AES String

标签 java encryption encoding character-encoding aes

我正在尝试解密从后端服务器接收到的字符串 "~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

有什么想法吗?

最佳答案

您应该在方法的开头解码字符串,而不是编码字符串的平台特定表示。

byte[] base64TextToDecrypt = Base64.decodeBase64(textToDecrypt);

或者更准确地说:

byte[] bytesToDecrypt = Base64(base64TextToDecrypt);

如果您正确命名变量。

一般来说,每次您(觉得您必须)使用 String.getBytes(): byte[] 方法或 String(byte[])构造函数你可能做错了什么。您应该首先考虑您要做什么,并指定一个 如果您确实需要使用它。

在您的情况下,converted 变量中的输出可能是字符编码的。所以你可以使用以下片段:

String plainText = new String(converted, StandardCharsets.UTF_8);
System.out.println(plainText);

而不是你现在拥有的。

关于javax.crypto.IllegalBlockSizeException : last block incomplete in decryption - Decrypting an encrypted AES String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13261252/

相关文章:

PHP自编码算法

ios - 将&符号字符转换为utf 8

java - JScrollPane 不显示在滚动上

android - 如何在android中使用初始化向量进行AES-256加密和解密

java - 如何在 Java 矩阵(二维数组)中的 10 x 10 0 矩阵周围制作 "border"的 1

java - 使用java进行AES解密

c# - 是否可以使用Base64在加密字符串中获取冒号

python - 如何将 html 字符串转换为 utf-8?获取 UnicodeDecodeError 错误

java - 模拟的GUI渲染

java - 动态类加载 - Java