我解密了一个文件,但它没有显示解密的字符串。它还抛出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());
答案 0 :(得分:0)
当输入数据不是块大小的倍数(在AES情况下为16字节)时,会发生IllegalBlockSizeException
。
此问题是由您读取解密数据的方法引起的。正如Jesper和JB Nizet的评论中所解释的那样,加密数据作为文本是不可读的。尝试将其作为字符串(无论字符集)读取都无法正常工作。
所以......确保您将文件作为字节流写入磁盘并以相同的方式读取。这应该确保您拥有完全正确的数据(这将是正确的长度)。
我推荐像Apache commons-lang FileUtils.writeByteArrayToFile
和FileUtils.readFileToByteArray
这样的东西,或者用Java IO库编写自己的东西。