我认为我的问题需要一些我可能没有的基本知识。
我正在解密像这样的字节数组:
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需要更新或其他什么东西?
答案 0 :(得分:2)
这里可能存在一些混淆,因为BC C#版本目前提供CTR模式作为块密码,即BufferedBlockCipher,尽管它应该作为流密码(也称为BufferedStreamCipher)提供。
为了获得完整的输出,您应该在所有其他处理之后调用其中一个DoFinal方法(在密码上)。密码一次缓冲输入一个块,只有在知道你完成后才能输出一个部分块。
最好是调用DoFinal,即使它是BufferedStreamCipher,也可以通知底层密码清理并重置另一次运行。
答案 1 :(得分:0)
我无法相信我在这个问题上花了10个小时!!!!
我刚刚编写了一个最小的应用程序,只是为了隔离问题,基本上它看起来像我在原始帖子中发布的代码并且它正在工作!!!
我在原始代码中发现我在每个段之间调用.dofinal,这就是下一个段的混乱!!!!
Pfffiuuu ...早上8点,我已经整整一个晚上,我想我可以去睡觉了; - )