我将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文件,但最后有一些未知的角色(它们只在最后)。有什么办法可以删除吗?
提前致谢
答案 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");