写在前面

上一版协议

首先回顾的以下上一版的协议。

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 可以公开,但要保证不可预测。

写在最后

本次我们升级了协议,使得协议可以抵御「唯密文攻击」,本系列将会持续完善这一协议。

ESWINK , 版权所有丨如未注明 , 均为原创

原文标题:「其他分享」从零设计通信协议(二)

Eswink原创声明