我在c#中使用bouncy castle library进行加密和解密,我想知道如何处理小于块大小的纯文本?
这是我到目前为止所做的事情:
AesFastEngine engine = new AesFastEngine();
GcmBlockCipher cipher = new GcmBlockCipher(engine);
AeadParameters param = new AeadParameters(new KeyParameters(key), 128, iv, null);
cipher.Init(true, parameters);
byte[] encData = new byte[plain.Length];
cipher.ProcessBytes(plain, 0, plain.Length, encData, 0);
当普通数据小于块大小时,它什么都不做。
答案 0 :(得分:0)
不幸的是,Bouncy Castle和Oracle / Java实现不是在线。也就是说,不保留基础CTR模式加密的在线属性。在此上下文中,在线意味着字节在到达时直接加密/解密。这可能与处理加密的方式以及如何处理身份验证标记有关。
AES-CTR可以通过多种方式实施。您可以先对计数器进行加密,然后在到达时直接使用明文/密文进行异或。您也可以先缓冲明文,然后,一旦有完整的块,创建计数器,对其进行加密,然后对整个明文块进行异或。这在某种意义上具有优势,因为它更像CBC等其他操作模式。此外,您可能不必在整个内存中缓冲密钥流。
也可以不同方式处理身份验证标记。这里基本上有三种选择。您可以简单地将身份验证标记视为密文的单独实体。这使您可以保留CTR模式的在线属性,在我看来,应该是首选选项。您也可以将其视为密文的一部分,但在这种情况下,您会在解密期间丢失在线属性 ;在处理构成身份验证标记的最后一个字节数之前,您需要知道密文的结束位置。因此,您需要至少缓冲身份验证标记的字节大小。最后,仍然在解密期间,您可能只想在明文字节的验证之后返回明文字节。在这种情况下,您需要缓冲整个密文并一次性返回明文。
由于认证标签问题仅用于解密,因此实施CTR的方式可能只是缓冲Bouncy。您确实必须调用doFinal
- 正如Robert在评论中已经提到的那样 - 检索最后一个密文块以及身份验证标记。可能是加密尚未执行,因为加密例程也与解密例程保持一定的对称。