我最近遇到了一个或多或少这样做的应用程序:
- 从(可能其他人不知道的)键开始
- 生成随机 IV
- 使用密钥加密一些较小(约 160 字节)的有效负载,并在 CBC 模式下使用 AES256 生成 IV
- [>=60% 的有效负载由两个或三个 ASCII 字组成,这些字是从一个假定未知但或多或少容易猜到的几十个元素列表中选择的]
- 只需对键进行一些数学运算即可得出另一个 IV。这个 IV 对于每个数据包都是相同的,并且从密钥生成它的代码是公开的。
- 在 CBC 模式下使用 AES256 使用密钥和派生的 IV 加密小标题(32 字节)
- [此标头的大部分由固定数据组成,例如应该被认为是公开已知的“协议版本”,然后它包含一个 unix 时间戳(如果您知道数据包何时传输,则为已知数据)和之前用于有效载荷部分]
- 在线路上传输生成的加密标头+有效负载
接收部分知道(预共享)密钥,从中重新生成“标头 IV”,解密标头,从那里获取有效负载 IV,解密有效负载。
每个数据包都会重复整个过程,典型的应用程序每秒会传输 5 到 50 个数据包,并且由于其中许多只是“状态信息”,因此它们的明文之间的唯一区别是 unix 时间戳和(伪)随机生成的有效载荷 IV。
我绝对不是密码学专家,但据我所知,“从用于加密 32 个字节的密钥派生的固定 IV,其中 28 个是固定的和/或容易猜到的”至少应该引起一些警觉。
如何考虑这种方法的安全性?- “安全性”定义为即使有人可以从线路窃听数据包,也要对密钥和/或有效负载保密。