我无法理解 AES,并且想知道连续两次使用相同的密钥加密相同的文本是否应该给出相同的输出。
是否有任何盐或会改变输出的东西?
如果它没有给出相同的东西,如果盐是随机的并且他不知道,如何解密消息(使用密钥)?
如果它给出了同样的东西,彩虹表可以用来恢复消息吗?
我无法理解 AES,并且想知道连续两次使用相同的密钥加密相同的文本是否应该给出相同的输出。
是否有任何盐或会改变输出的东西?
如果它没有给出相同的东西,如果盐是随机的并且他不知道,如何解密消息(使用密钥)?
如果它给出了同样的东西,彩虹表可以用来恢复消息吗?
像 AES 这样的块密码是一种键控排列。在 AES 的情况下,它需要一个密钥,然后确定性地将一个 16 字节块转换为另一个 16 字节块。
要使用分组密码加密某些东西,您需要使用一种操作模式。通常,这些模式采用 IV(类似于盐),对于您加密的每条消息,它应该是不同的。IV 中的这种差异导致了完全不同的加密消息。使用相同的 IV 和密钥加密相同的消息总是返回相同的密文。使用相同的 IV 和密钥加密多个消息会削弱安全性,但程度取决于模式。
IV 所需的属性取决于选择的模式,有时它需要是唯一的(例如对于 CTR 模式),有时它需要是不可预测的随机性(例如对于 CBC 模式)。但它通常不必保密,因此您将其与密文一起发送给收件人,通常作为前缀。
有一些模式是为确定性加密而设计的。如果两条消息相同,使用这些模式您仍然会泄漏,但仅此而已。只有在需要确定性时才应使用这些模式。
AES是一种分组密码:它将一个分组(16 字节,在 AES 的情况下)和一个密钥(16、24 或 32 字节,对于 AES)作为输入,并输出另一个分组(同样,16 字节)。这是一个完全确定的算法,完全指定,世界上的每个人都应该为相同的输入块和密钥获得相同的输出块。
但是,您不加密块,而是加密消息。分组密码只是一个构建元素;实际加密使用一种重复调用分组密码的操作模式。有好的模式,也有不好的模式;目标是实现整个消息的机密性,并且不泄露部分信息,例如消息的两个部分是否彼此相等。特别是,如果我们要使用相同的密钥加密两条消息,我们通常不想透露两条消息是否相同,因此必须在两次加密之间的某个地方进行更改。
大多数操作模式使用初始化向量,这是注入非确定性的地方。一些模式(例如GCM或EAX)只需要一个非重复的 IV;计数器对他们来说可能很好,并且可以在某些上下文中隐含(例如,当给定通信流上有连续消息时,消息编号可以用作 IV)。其他一些模式,特别是 CBC,只有当 IV 是随机、统一地选择且具有强PRNG时,才是安全的,并且在选择明文数据时,下一个要使用的 IV 是未知的。未能满足所有这些要求是许多问题的根源,例如对 SSL 的 BEAST 攻击。
因此可以说安全对称加密至少需要内存(例如,记住一个计数器值)或随机性。“内存”可以是通用的全球计数器(例如当前时间,但要注意时钟调整!)。
如果你准备好容忍关于两个给定输入消息是否相同的小泄漏,那么就有可能拥有一个完全确定的、无内存的加密系统,但它与流式加密不兼容(你必须保持整个过程中内存中的消息)。基本上,您在消息上计算确定性 MAC 算法(例如HMAC)并将其输出用作 IV。这是一个两遍算法,这是不可避免的。如果两个源消息相同,那么它们将产生相同的加密消息,但如果它们在任何地方(甚至在它们的最后一位)不同,那么很有可能加密消息将完全不同。
不幸的是,内存和/或随机性是硬性要求的平台(例如智能卡)也是 RAM 非常宝贵的平台,而且两遍系统可能过于昂贵。