【问题标题】:Implications of Encoding/Decoding and Encrypting/Decrypting with variable buffers使用可变缓冲区进行编码/解码和加密/解密的含义
【发布时间】:2017-07-29 15:55:17
【问题描述】:

我有一个使用对称密钥加密解密数据的程序。

在加密过程中我:

  • 加密数据
  • Base64对其进行编码

解密时:

  • Base64 解码
  • 解密数据

它工作正常。现在我正在尝试在流缓冲区上执行此过程。假设使用上述程序对大量数据进行加密,并且仅在流式传输时进行解密。

在这种情况下,我对数据进行编码的缓冲区大小/chunk-size在我解码数据时是否重要?

如果我在 3000 字节的缓冲区中编码数据,我是否也应该读取最多 3000 字节并解码?还是这无关紧要?

另外,在解密时,我是否应该解密使用与将数据传递到 Cipher 时相同的缓冲区大小?

我尝试在独立程序中使用不同的值,它工作正常。但是,当我尝试流式传输时:

  1. 获取一些字节
  2. 解码
  3. 解密
  4. 保存到文件
  5. 对于下一组解密的字节,请继续附加到同一文件。

这种方式似乎适用于某些大小的数据,而不适用于其他数据。并且数据的最终大小与 lexx 相差 2-4 字节

我在这里遗漏了一些重要的原则吗?还是我可能在某个地方的逻辑或循环中犯了错误,导致一些字节被遗漏?

如果是后者,我会更深入地检查它。

谢谢
沙比尔

【问题讨论】:

  • 我不知道您的加密算法是什么,但通常您需要stream-cypher algorithm 才能正确执行流内容的加密/解密。
  • “如果我将数据编码到 3000 字节的缓冲区中,我是否也应该读取最多 3000 字节并解码?还是这无关紧要?” - 是否正确实现无关紧要(使用内部“环形”缓冲区,以防您选择不能被 4 整除的块大小)。
  • 缓冲区大小为 3000 我检查了流式解码字节(通过将其附加到一个文件)和批量解码字节的输出。他们似乎是平等的。但是,当我(解码+解密)并连续追加到文件时,最终输出与批量解密不同。

标签: encryption streaming decode encode


【解决方案1】:

感谢以上提示。我能够解决我遇到的问题。

正如上面的 cmets 所述,当将数据解码解密作为流时,缓冲区大小本身并不重要。

但是,我遇到问题的原因是因为我正在为每个新的传入数据块初始化 CipherOutputStream

相反,当我仅在开始时对其进行一次初始化并为单个加密数据包的所有块维护它时,流程照常工作并且没有问题。

CipherOutputStream cipherOutputStream = new CipherOutputStream(byteArrOutputStream, cipher);

这对流中的所有块都执行了一次,并且有效。

谢谢
沙比尔

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多