为什么解密的字符串无法显示?

时间:2014-01-08 12:09:51

标签: java encryption aes jce

我解密了一个文件,但它没有显示解密的字符串。它还抛出javax.crypto.IllegalBlockSizeException

这是我的代码:

File f=new File("C:/Users/User/Desktop/Test.txt");
int ch;

StringBuffer strContent = new StringBuffer("");
FileInputStream fin = null;
try {
    fin = new FileInputStream(f);
    while ((ch = fin.read()) != -1)
        strContent.append((char) ch);
    fin.close();
} 
catch (Exception e) {
    System.out.println(e);
}

KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);

SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] original =cipher.doFinal(strContent.toString().getBytes());

String originalString = new String(original);
JOptionPane.showMessageDialog(null,originalString.toString());

1 个答案:

答案 0 :(得分:0)

当输入数据不是块大小的倍数(在AES情况下为16字节)时,会发生IllegalBlockSizeException

此问题是由您读取解密数据的方法引起的。正如Jesper和JB Nizet的评论中所解释的那样,加密数据作为文本是不可读的。尝试将其作为字符串(无论字符集)读取都无法正常工作。

所以......确保您将文件作为字节流写入磁盘并以相同的方式读取。这应该确保您拥有完全正确的数据(这将是正确的长度)。

我推荐像Apache commons-lang FileUtils.writeByteArrayToFileFileUtils.readFileToByteArray这样的东西,或者用Java IO库编写自己的东西。