AES 加密有效负载作为签名

AES Encrypted payload as a signature

我有三条消息:

  1. 用户名
  2. IV,16字节
  3. 128 位 AES 加密负载

用户可以从同一网络上的多个 processes/devices 运行,并通过消息总线交换消息。每个用户都有一个预共享密钥(他们通过 SSL 调用中央服务器获得),该密钥每 X 小时更新一次并存储在内存中。

如果我使用预共享密钥(例如使用 try..catch(CryptoException)...)成功解密消息的第三部分,我是否可以安全地假设它来自消息的第 1 部分?

如果网络是开放的(没有加密的 WiFi),是否存在暴露用户名元数据(这没问题)以外的数据的风​​险?

这一定是微不足道的,我现在假设它会起作用,但假设是所有错误之母,尤其是在加密领域...

此外(主要是出于好奇),如果多个用户在同一个进程中并且流氓用户 A 知道应用程序的源代码(从 dll 反映的 C#)并且可以嗅探机器上的所有流量,还有什么额外的步骤 我需要保护同一进程中其他用户的共享密钥免受用户 A 的侵害? (C# 中的应用程序,恶意用户可以运行除应用程序之外的任何东西,例如汇编程序)。我应该打扰吗,或者如果流氓用户有这样的访问权,游戏就结束了?

更新: 这门精彩课程的第 4 周是此类问题的必备课程:https://class.coursera.org/crypto-010/lecture/preview

我直觉上期望的是合成 IV https://www.rfc-editor.org/rfc/rfc5297,在链接课程的其中一个讲座中有很好的描述

不,攻击者对数据的任何更改都可能导致此类异常。基本上大多数密码操作模式都能够解密任何密文;密文和明文之间存在1:1关系。取消填充可能会失败。此外,消息(部分)有可能出现乱码,无一例外。出于这个原因,您应该使用经过身份验证的加密(正如 CodesInChaos 已经提到的那样)。

乱码填充会使您面临填充 oracle 攻击,无论使用何种块密码,这需要每个字节尝试 128 次才能完全破坏 CBC 模式的机密性 (!)。

如果您使用类似 GCM 的模式(如果可用),则 IV 已经受到经过身份验证的密码的保护。但是,用户名不是,因此您应该将其包含在 AEAD 密码的 AAD 部分中。如果您使用 HMAC,那么一定要在密文中包含完整的消息。如果你使用 MAC 然后也使用一个单独的密钥(这对于 HMAC 也是可取的,但是对于例如 AES-CMAC 这是一个更强的要求)。

如果用户可以完全控制您的机器,那么是的,游戏就结束了。如果他们也可以直接访问数据,那么他们是否可以获得保护数据的密钥并不重要。