本章主要介绍几种对称密码算法,包括DES、三重DES、AES以及其他一些密码算法。在这之前,还介绍了比特序列、XOR运算以及一次性密码本。


比特序列

比特序列指由0、1组成的序列,将现实世界中的东西映射为比特序列的操作称为编码


XOR

XOR全称是exclusive or,中文名为异或

运算规则如下:

1
2
3
4
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 1 = 1
1 XOR 1 = 0

相同数字XOR的结果为0,不同数字XOR的结果为1。

将一个比特序列进行两次XOR,将得到明文。

例如:

1
2
3
4
5
6
7
    0 1 0 0 1 1 0 0     ... A
  1 0 1 0 1 0 1 0     ...    B
--------------------------------
    1 1 1 0 0 1 1 0     ...A  B
  1 0 1 0 1 0 1 0     ...     B
---------------------------------
    0 1 0 0 1 1 0 0     ... A

一次性密码本

一次性密码本是将明文与一串随机的等长的比特序列进行XOR运算。

只要通过暴力破解的方法对密钥空间进行遍历,无论什么密文总有一天也都能够被破译。然而一次性密码本 却不能,因为破译者根本不知道 所破译的明文 是不是 原始的明文

但是,一次性密码本 并没有实用性。与其以安全的方式发送密码,不如以安全的方式发送明文。


DES

DES(Data Encryption Standard) 是由美国联办信息处理标准所采用的一种对称密码。

  • 是一种将64比特的明文加密成64比特的密文的对称加密算法,密钥长度为56比特(实际上DES的密钥长度为64位,但每隔7位有个校验位)。
  • 是以64比特的明文(比特序列)为一个单位来进行加密的,这64比特的单位称为 分组。所以 DES 也是 分组密码(block cipher) 的一种。
  • 如果明文较长,九需要对 DES 加密进行迭代,而迭代的具体方式称为 模式(mode)

3-DES-Encrypt

DES的结构(Feistel网络)

Feistel网络 也称为 Feistel结构Feistel密码。这一结构不仅被用于DES,在其他很多密码算法中也有应用。

Feistel网络 中,加密的每个步骤称为 轮(round),整个加密过程就是若干次轮的循环。

3-DES-Feistel

在每轮中,会将输入的明文分为左右两块,每块32比特。右侧内容和子密钥通过论函数f,生成密钥与左侧进行XOR操作,生成加密后的左侧。右侧不做改变。

下图为 Feistel网络 进行三轮加密的示意图。

3-DES-Feistel-Encrypt

解密的话,只需要将子密钥的顺序颠倒就行。

3-DES-Feistel-Decrypt

总结一下 Feistel网络 的特性:

  • Feistel网络轮数可以任意增加,无论进行多少轮加密计算,都不会发生无法解密的情况。
  • 加密时无论使用什么函数作为论函数都可以正确解密。因为左侧只进行XOR操作,XOR两次相同的值,将会恢复原始的明文。
  • 加密和解密使用完全相同的结构来实现。

针对DES的攻击

在可以选择任意明文并得到其加密的结果的情况下,使用 差分分析 以及 线性分析 的攻击。


三重DES

三重DES(triple-DES) 是为了增强DES的强度,将DES重复三次得到的一种密码算法。

加密过程如下图所示:

3-DES-Triple-Encrypt

值得注意的是,第二重DES 并不是加密,而是 解密。会出现这样的情况的原因主要是为了兼容之前的DES加密模式。如果 三重DES加密 使用三个 相同 的密钥进行加密,则效果和一重DES加密的效果是一样的。

三重DES 的解密过程与加密过程正好相反。

3-DES-Triple-Decrypt


AES

AES(Advanced Encryption Standard) 是取代其前任标准(DES)二称为新标准的一种对称密码算法。

AES的选拔过程是对全世界公开的,被选为AES的密码算法必须无条件的免费供全世界使用

最终,Rijndael 算法被选为AES的标准算法。

其他四个候选算法包括: MARS(IBM公司)RC6(RSA公司)Serpent(Anderson,Biham,Knudsen)Twofish(Counterpane公司)

Rijndael

Rijndael 是由比利时密码学家 Joan DaemenVincent Rijmen 设计的分组密码算法。其分组长度和密钥长度可以分别以32比特为单位在128比特到256比特的范围内进行选择。

Rijndael 算法也由多个 组成,其中每一轮分为 SubBytesShiftRowsMixColumnsAddRoundKey 共4个步骤。

SubBytes

在这一步骤中,首先,需要逐个字节的对16字节的输入数据进行 SubBytes 处理。从一张拥有256个值的 替换表 中找到对应的对应值,进行替换。相当于前面所说的替换密码的256个字母版本。

3-AES-SubBytes

ShiftRows

ShiftRows 这一步中,将以4字节为单位的行按照一定的规则向左平移,且每一行平移的字节数是不同的。

3-AES-ShiftRows

MixColumns

MixColumns 这一步中,对一个4字节的值进行比特运算,将其变成另外一个4字节的值。

3-AES-MixColumns

AddRoundKey

最后需要对 MixColumns 的结果进行 AddRoundKey 操作。在这一步中,主要是对 MixColumns 的结果与 轮密钥 进行 XOR 操作。

3-AES-AddRoundKey

综上所述, Rijndael 的加密过程中,每一轮所进行的处理为:

SubBytes → ShiftRows → MixColumns → AddRoundKey

而解密时,则与加密相反,即:

AddRoundKey → InvMixColumns → InvShiftRows → InvSubBytes

针对Rijndael的攻击

攻击方式和之前介绍的攻击方式差不多。但 Rijndael 的算法有着严谨的数学结构,不排除有破译者通过公式推导实现破译的可能。