【问题标题】:BouncyCastle Last Byte Decrypt ProblemBouncyCastle 最后一个字节解密问题
【发布时间】:2010-11-14 09:29:01
【问题描述】:

我正在使用 Bouncy Castle 从文件系统中解密一个 XML 文件。我输出了解密后的文本,并在最后一个数据字节上得到了一个致命错误 SAXParseException。下面是我的解密方法和密码对象的设置。

我最初使用密码流,一切正常(注释掉的代码是我的流)。由于策略文件和最终用户没有 256 位无限版本,我需要使用充气城堡。

知道为什么最后一个字节没有通过吗?

来自构造函数:

keyParam = new KeyParameter(key);
engine = new AESEngine();
paddedBufferedBlockCipher = 
    new PaddedBufferedBlockCipher(new CBCBlockCipher(engine));

解密方法:

public void decrypt(InputStream in, OutputStream out) {
    try
    {
        paddedBufferedBlockCipher.init(false, 
            new ParametersWithIV(keyParam, _defaultIv));
//          cipher.init(Cipher.DECRYPT_MODE, secretKey, ivs);
//          CipherInputStream cipherInputStream 
//                      = new CipherInputStream(in, cipher);

        byte[] buffer = new byte[4096];
        byte[] outBuffer = new byte[4096];

        for (int count = 0; (count = in.read(buffer)) != -1;) {
            paddedBufferedBlockCipher.processBytes(buffer, 0, 
                count, outBuffer, 0);
            out.write(outBuffer, 0, count);         
        }
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

[Fatal Error] :40:23: Element type "Publi" must be followed by either attribute specifications, ">" or "/>".
org.xml.sax.SAXParseException: Element type "Publi" must be followed by either attribute specifications, ">" or "/>".
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:264)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:292)

【问题讨论】:

  • 我不确定,我从来不用检查流选项。由于我在循环中执行此操作,因此我不需要 doFinal() 并且只是假设这可以正常工作。我将为“count”变量做一个系统输出,看看最后打印的数字是什么
  • 错误:“处理缓冲区中的最后一个块。如果缓冲区当前已满并且需要添加填充,则调用 doFinal 将产生 2 * getBlockSize() 字节。”

标签: java bouncycastle encryption


【解决方案1】:

你用最后的数据块调用doFinal() 吗?

public void decrypt(InputStream in, OutputStream out) {
    try
    {
        paddedBufferedBlockCipher.init(false, 
            new ParametersWithIV(keyParam, _defaultIv));
        byte[] buffer = new byte[4096];
        byte[] outBuffer = new byte[4096];

        for (int count = 0; (count = in.read(buffer)) != -1;) {
            int c2 = paddedBufferedBlockCipher.processBytes(buffer, 0, 
                count, outBuffer, 0);
            out.write(outBuffer, 0, c2);                     
        }
        count = paddedBufferedBlockCipher.doFinal(outBuffer, 0);
        out.write(outBuffer, 0, count);                     
   }
    catch(Exception e) {
        e.printStackTrace();
    }
}

【讨论】:

  • 在末尾添加这两行确实可以使输出正确。我得到了整个 XML 文件。但是即使文件看起来不错,仍然会得到与上面相同的 SAXParseException
  • 我正试图在解密完成后立即将 XML 反序列化为一个对象
  • 我实际上尝试了两个 XML 文件。一个给出了上面的例外。另一个文件给出“在文档的元素内容中发现了一个无效的 XML 字符(Unicode:0x0)。”
  • 上面这个版本的c2怎么样。你能给我们展示一个可运行的测试程序(初始化的东西)以便我们也可以测试它吗?
  • 您能否保存解密后的输出并检查文件大小是否等于原始文件大小?我 99% 确定您的加密没有正确加密整个输入文件。看看这个例子:osdir.com/ml/encryption.bouncy-castle.devel/2006-12/…
猜你喜欢
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
相关资源
最近更新 更多