写在前面
- 本系列的介绍以及协议功能见「从零设计通信协议(一)」。
- 本系列的全部文章见「从零设计通信协议系列」。
上一版协议
首先回顾的以下上一版的协议。
1 字节 | X 字节 |
---|---|
数据长度 | 数据 |
整个数据包使用 AES-128-ECB 加密。
- 数据长度:表示「数据」的长度,单位为字节。
- 数据:表示具体的通信数据。
我们可以通过数据包的前一个字节获取数据长度,之后向后读取 X 字节即可获取全部的数据,整个数据包使用 AES-128-ECB 加密,看起来很安全。其实使用 AES-128-ECB 加密容易受到「唯密文攻击」。
唯密文攻击:指在仅知道密文的情况加进行攻击,攻击成功轻则获得部分或全部明文,重则获取密钥。
唯密文攻击_百度百科
ECB 模式的缺陷
ECB 模式的缺陷就是相同的明文会产生相同的密文,这会让攻击者有机会猜出密文的含义,难以抵抗统计分析。
例如我和 Alice 对话,每次我发送的第一个信息是「你好」,假设使用 ECB 模式加密后的密文为「#¥%#¥」,那么如果 Eve 中间截获我的数据包,发现我和 Alice 每次通信我都会先发一个「#¥%#¥」给 Alice。根据日常的对话习惯,Eve 猜测这可能是在打招呼,进而怀疑「#¥%#¥」解密后是「你好」、「有空么」之类的话,这已经十分接近我们的明文信息了。
上面的例子可能并不特别可怕,但是如果进行统计分析的话就难说了。
CBC 模式
CBC 即密码分组链接(Cipher-Block Chaining),我们无需关心原理,只需要知道该模式通过一个随机的初始化向量 IV 保证了每条消息的唯一性,即相同的明文可以对应许多个密文。
第二版协议
下面我们使用 AES-128-CBC 算法来加密我们的通讯信息,使用 CBC 模式加密不仅需要密钥,也需要一个随机的初始化向量 IV,所以我们需要将 IV 传递给对方。
16 字节 | 1 字节 | X 字节 |
---|---|---|
IV | 数据长度 | 数据 |
数据包从第 17 个字节开始的所有数据要使用 AES-128-CBC 加密。
- IV:AES-128-CBC 加密时所用的初始化向量。
- 数据长度:表示「数据」的长度,单位为字节。
- 数据:表示具体的通信数据。
初始化向量 IV 可以公开,但要保证不可预测。
写在最后
本次我们升级了协议,使得协议可以抵御「唯密文攻击」,本系列将会持续完善这一协议。
呜呜呜 只到了二
还没弃坑呢~
期待三啊。。。