解密没有正确发生

时间:2012-07-02 11:06:28

标签: java encryption

我将XML文件作为字节数组导入项目

RandomAccessFile rnd = new RandomAccessFile(filePath, "r");
byte[] fileData = new byte[(int) rnd.length()];
rnd.read(fileData);

我使用java.crypto

加密了数组
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");

byte[] encypted = new byte[cipher.getOutputSize(fileData.length)];
int len = cipher.update(fileData, 0, fileData.length, encypted, 0);
len += cipher.doFinal(encypted, len);

当我解密字节数组并使用

打印它时
System.out.println(new String(decrypted, "UTF-8"));

我得到了XML文件,但最后有一些未知的角色(它们只在最后)。有什么办法可以删除吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

看到一个类似的问题here,但答案可能与您的情况非常相关:

  

1.如果您不知道用于加密的填充,则使用解密     '没有填充'设置。这将解密所有内容,包括填充,     并且由于填充不匹配而不会抛出错误。

     

2.当您解密密文时,请查看最后一个块     输出,看看使用了什么填充。不同的填充物离开     不同的字节模式,所以通常很容易分辨。

     

3.设置你的解密方法以期望正确的填充类型,和     它将自动为您删除。

并且这是相关的你这里是一个关于填充模式的链接等:Padding Wikipedia

这里也是一个非常好的使用DES加密的教程:http://www.exampledepot.com/egs/javax.crypto/desstring.html这里是针对DES中的PBE: PBE with HMAC(SHA1) and DES(EDE)

答案 1 :(得分:0)

有很多遗漏的代码可能很重要。我注意到的一件事是你在没有指定任何字符编码的情况下读取数据,然后在解密时你使用UTF-8解码器创建一个字符串。只有原始XML文件是UTF-8编码才有意义,这是完全可能的。此外,RandomAccessFile.read()返回一个包含实际读取的字节数的int。您应该使用该数字而不是假设读入整个数组。

答案 2 :(得分:-1)

我更改了填充并且它有效。

cipher = Cipher.getInstance("DESede/CFB8/NoPadding");