IllegalBLockSizeException when decrypting



我写了一个加密和解密函数。加密工作正常,但我总是在解密中得到非法块大小异常。

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 properly padded 的东西。

谢谢

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

这不是填充问题 - 加密调用将填充此精细,由于您将字节数组编码为字符串的方式,因此缺少字节。

您将在此 SO 问题的答案中找到一些 base 64 说明。

相关内容

  • 没有找到相关文章

最新更新