1

我在 c# 中使用bouncy castle 库进行加密和解密,我想知道如何处理小于块大小的纯文本?

这是我到目前为止所做的:

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);

当普通数据小于块大小时,它什么也不做。

4

1 回答 1

0

不幸的是,Bouncy Castle 和 Oracle/Java 实现不在线。也就是说,不会保留底层 CTR 模式加密的在线属性。在这种情况下,在线意味着字节在到达时直接加密/解密。这可能与如何处理加密以及如何处理身份验证标签有关。

AES-CTR 可以通过多种方式实现。您可以先加密计数器,然后在它到达时直接与明文/密文进行异或。您还可以先缓冲明文,然后,一旦您有一个完整的块,创建计数器,加密它,然后异或一个完整的明文块。这在某种意义上具有优势,因为它更类似于其他操作模式,例如 CBC。此外,您可能不必一直在内存中缓冲密钥流。

身份验证标签也可以有不同的处理方式。这里基本上有三个选项。您可以简单地将身份验证标签视为密文的单独实体。这使您可以保留 CTR 模式的在线属性,并且在我看来,应该是首选选项。您也可以将其视为密文的一部分,但在这种情况下,您会在解密期间丢失在线属性;您需要知道密文在哪里结束,然后才能处理组成身份验证标签的最后一个字节数。因此,您至少需要缓冲身份验证标签的字节大小。最后,仍然在解密期间,您可能只想在验证后返回明文字节明文字节。在这种情况下,您需要缓冲整个密文并一次性返回明文。

由于身份验证标签问题仅用于解密,因此由于 CTR 的实现方式,Bouncy 可能只会缓冲。您确实必须调用doFinal- 正如罗伯特在评论中已经提到的那样 - 检索最后一个密文块以及身份验证标签。可能还没有执行加密,因为加密例程也与解密例程保持某种对称。

于 2016-04-09T15:49:03.017 回答