如何解密几个片段中的大缓冲区? Bouncy Castle,AES / CTR / NoPadding

时间:2013-02-21 06:06:01

标签: c# encryption bouncycastle

我认为我的问题需要一些我可能没有的基本知识。

我正在解密像这样的字节数组:

var cipher = CipherUtilities.GetCipher("AES/CTR/NoPadding");
cipher.Init(false, new ParametersWithIV(new KeyParameter(bkey), bIV));
byte[] DecryptedChunk = cipher.ProcessBytes(EncryptedChunk, 0, ChunkSize);

我想了解如何在2中删除此缓冲区并解密上半部分然后解密后半部分。

如果我这样做:

var cipher = CipherUtilities.GetCipher("AES/CTR/NoPadding");
cipher.Init(false, new ParametersWithIV(new KeyParameter(bkey), bIV));
byte[] FirstDecryptedChunk = cipher.ProcessBytes(FirstEncryptedChunk, 0, FirstChunkSize);
byte[] SecondDecryptedChunk = cipher.ProcessBytes(SecondEncryptedChunk, 0, SecondChunkSize);

然后第一个Chunk没问题,但第二个是错误的。

我花了6个小时在网上阅读,我找不到解释。 某种类型的计数器和IV需要更新或其他什么东西?

2 个答案:

答案 0 :(得分:2)

这里可能存在一些混淆,因为BC C#版本目前提供CTR模式作为块密码,即BufferedBlockCipher,尽管它应该作为流密码(也称为BufferedStreamCipher)提供。

为了获得完整的输出,您应该在所有其他处理之后调用其中一个DoFinal方法(在密码上)。密码一次缓冲输入一个块,只有在知道你完成后才能输出一个部分块。

最好是调用DoFinal,即使它是BufferedStreamCipher,也可以通知底层密码清理并重置另一次运行。

答案 1 :(得分:0)

我无法相信我在这个问题上花了10个小时!!!!

我刚刚编写了一个最小的应用程序,只是为了隔离问题,基本上它看起来像我在原始帖子中发布的代码并且它正在工作!!!

我在原始代码中发现我在每个段之间调用.dofinal,这就是下一个段的混乱!!!!

Pfffiuuu ...早上8点,我已经整整一个晚上,我想我可以去睡觉了; - )