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

本文关键字:Bouncy 缓冲区 Castle NoPadding AES CTR 解密 何解密 片段 几个 | 更新日期: 2023-09-27 18:00:24

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

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

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有关,必须更新还是什么?

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

这里可能有一些混乱,因为BC C#版本目前提供CTR模式作为块密码,即BufferedBlockCipher,尽管它应该也作为流密码可用,即Buffered StreamCipher。

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

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

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

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

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

Pffiniuu。。。早上8点,我已经花了一整晚的时间,我想我可以上床睡觉了;-)