java - 解密时出现 IllegalBLockSizeException

标签 java encryption block-cipher

我编写了一个加密和解密函数。加密工作正常,但我总是在解密时遇到 IllegalBlockSizeException。

public static String aes_encrypt (String text, String key) 
{
    SecretKey skey = new SecretKeySpec(key.getBytes(), "AES"); 
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
    cipher.init(Cipher.ENCRYPT_MODE, skey);

    return new String((cipher.doFinal(text.getBytes())));

}

这是解密函数:

public static String aes_decrypt (String text, String key) 
{

    SecretKey skey = new SecretKeySpec(key.getBytes(), "AES"); 
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
    cipher.init(Cipher.DECRYPT_MODE, skey);

    return new String((cipher.doFinal(text.getBytes())));
}

这是测试此功能的简单主要方法:

public static void main (String args[])
{
    String text = "Hello, world!";
    String key = "nv93h50sk1zh508v";
    String en, de;

    System.out.println("Text: " + text);
    System.out.println("Encrypted: " + (en = aes_encrypt(text, key)) 
            + " length = " + en.length());
    System.out.println("Decrypted: " + (de = aes_decrypt(en, key)));
}

有谁知道如何正确“填充”加密字符串以便我可以解密它? (我尝试用 0 填充字符串,直到长度为 16 的倍数,但得到类似 string not displayedly padded 的结果。)

谢谢

最佳答案

我认为问题在于您使用 String 构造函数。这是使用文本编码机制转换为字符串,该机制可能无法保留字节数组中的每个值 - 系统默认编码中不支持的值可能会被丢弃,从而使编码数据比应有的短。如果您需要字符串表示形式,请转换为十六进制或 Base 64 编码。并反转您在解密方法开始时使用的任何编码。

这不是填充问题 - 加密调用将填充这个罚款,由于您将字节数组编码为字符串的方法,您缺少字节。

您会在 this SO question 的答案中找到一些 Base 64 指令.

关于java - 解密时出现 IllegalBLockSizeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10322343/

相关文章:

java - 无法解密在webcrypto api中加密的java数据

java - Jframe JLabel,仅当我调整窗口大小时才刷新图像

java - 使用 Jackson 反序列化为 Map

database - 使用 SHA1 key 避免 BigTable 或 HBase 中的热点

c# - 将 CryptoStream 解密为 MemoryStream

c# - 使用c#加密数据并使用openssl api解密数据,为什么解密数据末尾有很多垃圾填充?

java - Vaadin 10 对话框不显示

java - 在 azure 中找不到该网址的网页

encryption - 使用 Coldfusion 的 Encrypt 函数加密一个十六进制 block 并返回一个 block 长度结果

java - Blob 算法不起作用