【问题标题】:How AES/GCM deals with data smaller than block size?AES/GCM 如何处理小于块大小的数据?
【发布时间】:2016-07-30 19:44:20
【问题描述】:

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

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

【问题讨论】:

  • 你必须在你处理的最后一个数据块上调用doFinal(..)
  • AES/GCM 不需要填充,它使用 CTR(计数器)模式。正如@Robert 所说,您确实需要调用doFinal(),这是生成身份验证标签所必需的。

标签: c# encryption aes bouncycastle aes-gcm


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2020-06-23
    • 1970-01-01
    • 2022-10-05
    相关资源
    最近更新 更多