java中AES解密算法中的异常

java中AES解密算法中的异常,java,encryption,aes,Java,Encryption,Aes,这是使用AES算法在java中加密和解密字符串的代码。它在解密时抛出非法块大小异常。 我知道这是因为解密方法的输入字符串长度与填充不匹配。我不知道如何解决这个问题。 我是加密解密的新手。请帮帮我 堆栈跟踪: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher at com.sun.crypto.provider.

这是使用AES算法在java中加密和解密字符串的代码。它在解密时抛出非法块大小异常。 我知道这是因为解密方法的输入字符串长度与填充不匹配。我不知道如何解决这个问题。 我是加密解密的新手。请帮帮我

堆栈跟踪:

    javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    at test.AES.AESdecryptalgo(AES.java:76)
    at test.AES.main(AES.java:95)
代码:

封装测试;
导入javax.crypto.*;
导入javax.crypto.spec.*;
导入java.security.*;
公共类AES
{
公共字节[]加密;
公共字节[]原件;
公共字符串originalString;
密码;
SecretKeySpec skeySpec;
IvParameterSpec;
字节[]iv;
/*公共静态字符串asHex(字节buf[]
{
StringBuffer strbuf=新的StringBuffer(buf.length*2);
int i;
对于(i=0;i

}`使用CBC模式时,必须提供初始化向量

加密时,让提供商为您选择IV:

…
cipher.init(Cipher.ENCRYPT_MODE, key);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
…
稍后,解密时,使用相同的IV初始化密码:

…
IvParameterSpec spec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key, spec);
…

您必须更改
AESencryptalgo
以返回
字节[]
,而不是
字符串。问题就从这里开始:

newtext = new String(encrypted);
// System.out.println("ENCRYPTED "+newtext);
return newtext;
更改方法的返回类型后,应进行以下更改:

//newtext = new String(encrypted);
// System.out.println("ENCRYPTED "+newtext);
//return newtext;
return encrypted;
问题在于
字符串是一个字符序列,而加密文本是一个字节序列(有关此差异的详细摘要,请参阅)


当您试图从字节数组构造
字符串时,Java会使用系统的默认字符集,尽力将这些字节转换为字符。不幸的是,这种映射并不总是成功的(通常当加密的字节超出ASCII字符集时)。只有在解密新的
字符串时,您才会注意到这个问题(这将无法正确地将字符序列转换回原始字节序列)。

重新发布。。。由同一用户执行!:@格雷格-这实际上是一个不同的例外,因为他没有很好地遵循关于另一个问题的示例。@erickson:我很确定这是同一个代码。没有人会在我的机器上抛出任何异常。当然,他的示例并没有调用他所说的异常所在的函数。我做了此更改…但它在字节[]iv=params.getParameterSpec(IvParameterSpec.class).getIV()处抛出空指针异常@user372066-请用当前版本替换问题中的代码。
//newtext = new String(encrypted);
// System.out.println("ENCRYPTED "+newtext);
//return newtext;
return encrypted;