【问题标题】:AES-GCM: #C Microsoft Class additional authenticated data"(AAD)"AES-GCM:#C Microsoft 类附加认证数据“(AAD)”
【发布时间】:2021-05-22 19:35:35
【问题描述】:

我正在尝试实现 AES-GCM 加密,但是当涉及到

cipher.Encrypt(_iv, toEncrypt, cipherText, tag, associatedData);

我意识到我还需要实现关联数据,这是一个 byte[] 数据类型,有人知道 AAD 部分应该来自哪里吗?

【问题讨论】:

  • 可能与stackoverflow.com/a/60891115/706456 相关,但此处未使用 ADD(为空)。文档说它必须在解密阶段出现。添加它应该是微不足道的:只需传递 ADD 的纯文本 byte[]。在解密期间为 ADD 传递相同的值。
  • AAD 是不会加密但会受到完整性保护的数据。如果您不需要该功能,请不要使用它。它是可选的。 AAD 需要单独发送,因为它不是密文的一部分。
  • 嘿@ArtjomB。所以你的意思是如果我需要 AAD 部分,我应该将 NULL 传递给 Encrypt 函数,然后将该 AAD 部分作为纯文本添加到最后(基本上 AAD 是纯文本中 while 消息的长度,它是 4 个字节)
  • 嘿@oleksii 这是否意味着如果我需要 AAD 部分,我应该将 NULL 传递给 Encrypt 函数(因为我们不应该加密 AAD 部分)然后将 AAD 部分作为纯文本添加到最后(基本上 AAD 是纯文本中整个消息的长度,它应该是一个 4 字节的数组)
  • 不,我完全不是这个意思。如果您的用例(为什么首先要加密)没有任何其他需要完整性保护但未加密的数据,那么您只需跳过 associatedData 值。 AAD 是associatedData

标签: c# encryption ssh aes-gcm


【解决方案1】:

由于您尝试实现 AES-GCM 加密,我假设您已经知道 AES-GCM 加密的两个主要部分是:

  • 使用变体的计数器操作模式来保护输入数据的机密性。在您的情况下,AES 用作底层分组密码。
  • 使用 GHASH 算法验证机密数据的真实性。

这意味着明文(toEncrypt)需要使用计数器模式的变体进行加密,并从生成的密文(cipherText)中计算身份验证标签。

附加的认证数据 (AAD) 保护明文的机密性而不对其进行加密,通常 AAD 意味着少量数据,如版本号、地址和端口..

所以你只需要在AAD(关联数据)上应用GHASH算法,并将加密操作的输出标签值赋给GHASH算法的输入标签即可。请注意,这假设函数使用的方案是加密输入数据然后散列 AAD,如果顺序相反,您必须将 AAD 的 GHASH 函数的输出标签分配给 GHASH 函数的输入标签以加密数据。

【讨论】:

    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 2012-11-05
    • 2013-07-17
    • 2019-11-14
    • 2023-01-31
    • 2022-01-15
    • 2017-10-25
    • 2018-10-18
    相关资源
    最近更新 更多