3

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

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

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有关吗?

4

2 回答 2

2

也许这里有一些混淆,因为 BC C# 版本目前提供 CTR 模式作为分组密码,即 BufferedBlockCipher,尽管它应该也可以作为流密码,即 BufferedStreamCipher。

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

即使它是 BufferedStreamCipher,调用 DoFinal 也是一种很好的做法,以指示底层密码清理并重置以进行另一次运行。

于 2013-02-21T12:58:14.690 回答
0

我不敢相信我在这个问题上花了 10 个小时!!!!

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

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

Pfffiuuu ... 早上 8 点,我已经花了整夜的时间,我想我可以去睡觉了 ;-)

于 2013-02-21T13:10:36.003 回答