【问题标题】:Decrypting does not happen correctly解密不正确
【发布时间】:2012-07-02 11:06:28
【问题描述】:

我将一个 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 文件,但末尾有一些未知字符(它们仅在末尾)。有什么办法可以去掉吗?

提前致谢

【问题讨论】:

    标签: java encryption


    【解决方案1】:

    查看类似的问题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)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我改变了填充,它起作用了。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-03-15
          • 2021-04-02
          • 2012-02-04
          • 1970-01-01
          • 2020-05-28
          • 2012-07-19
          • 2011-07-10
          相关资源
          最近更新 更多