0

我将一个 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 文件,但最后有一些未知字符(它们只在最后)。有什么办法可以删除这个吗?

提前致谢

4

3 回答 3

2

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

1.如果您不知道使用什么填充进行加密,则使用“无填充”设置解密。这将解密所有内容,包括填充,并且不会因为填充不匹配而引发错误。

2.解密密文后,查看输出的最后一个块,看看使用了哪些填充。不同的填充会留下不同的字节模式,因此通常很容易分辨。

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

如果这与您相关,这里有一个关于填充模式等的链接:Padding Wikipedia

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

于 2012-07-02T11:10:41.130 回答
0

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

于 2012-07-03T00:43:31.113 回答
-1

我改变了填充,它工作。

cipher = Cipher.getInstance("DESede/CFB8/NoPadding");
于 2012-07-04T04:56:27.270 回答