图解密码技术 - 对称密码
Contents
本章主要介绍几种对称密码算法,包括DES、三重DES、AES以及其他一些密码算法。在这之前,还介绍了比特序列、XOR运算以及一次性密码本。
比特序列
比特序列指由0、1组成的序列,将现实世界中的东西映射为比特序列的操作称为编码。
XOR
XOR全称是exclusive or,中文名为异或。
运算规则如下:
|
|
相同数字XOR的结果为0,不同数字XOR的结果为1。
将一个比特序列进行两次XOR,将得到明文。
例如:
|
|
一次性密码本
一次性密码本是将明文与一串随机的等长的比特序列进行XOR运算。
只要通过暴力破解的方法对密钥空间进行遍历,无论什么密文总有一天也都能够被破译。然而一次性密码本 却不能,因为破译者根本不知道 所破译的明文 是不是 原始的明文。
但是,一次性密码本 并没有实用性。与其以安全的方式发送密码,不如以安全的方式发送明文。
DES
DES(Data Encryption Standard) 是由美国联办信息处理标准所采用的一种对称密码。
- 是一种将64比特的明文加密成64比特的密文的对称加密算法,密钥长度为56比特(实际上DES的密钥长度为64位,但每隔7位有个校验位)。
- 是以64比特的明文(比特序列)为一个单位来进行加密的,这64比特的单位称为 分组。所以 DES 也是 分组密码(block cipher) 的一种。
- 如果明文较长,九需要对 DES 加密进行迭代,而迭代的具体方式称为 模式(mode)。
DES的结构(Feistel网络)
Feistel网络 也称为 Feistel结构、 Feistel密码。这一结构不仅被用于DES,在其他很多密码算法中也有应用。
在 Feistel网络 中,加密的每个步骤称为 轮(round),整个加密过程就是若干次轮的循环。
在每轮中,会将输入的明文分为左右两块,每块32比特。右侧内容和子密钥通过论函数f,生成密钥与左侧进行XOR操作,生成加密后的左侧。右侧不做改变。
下图为 Feistel网络 进行三轮加密的示意图。
解密的话,只需要将子密钥的顺序颠倒就行。
总结一下 Feistel网络 的特性:
- Feistel网络 的 轮数可以任意增加,无论进行多少轮加密计算,都不会发生无法解密的情况。
- 加密时无论使用什么函数作为论函数都可以正确解密。因为左侧只进行XOR操作,XOR两次相同的值,将会恢复原始的明文。
- 加密和解密使用完全相同的结构来实现。
针对DES的攻击
在可以选择任意明文并得到其加密的结果的情况下,使用 差分分析 以及 线性分析 的攻击。
三重DES
三重DES(triple-DES) 是为了增强DES的强度,将DES重复三次得到的一种密码算法。
加密过程如下图所示:
值得注意的是,第二重DES 并不是加密,而是 解密。会出现这样的情况的原因主要是为了兼容之前的DES加密模式。如果 三重DES加密 使用三个 相同 的密钥进行加密,则效果和一重DES加密的效果是一样的。
三重DES 的解密过程与加密过程正好相反。
AES
AES(Advanced Encryption Standard) 是取代其前任标准(DES)二称为新标准的一种对称密码算法。
AES的选拔过程是对全世界公开的,被选为AES的密码算法必须无条件的免费供全世界使用!
最终,Rijndael 算法被选为AES的标准算法。
其他四个候选算法包括: MARS(IBM公司)、 RC6(RSA公司)、 Serpent(Anderson,Biham,Knudsen)、 Twofish(Counterpane公司)。
Rijndael
Rijndael 是由比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计的分组密码算法。其分组长度和密钥长度可以分别以32比特为单位在128比特到256比特的范围内进行选择。
Rijndael 算法也由多个 轮 组成,其中每一轮分为 SubBytes、 ShiftRows、 MixColumns、 AddRoundKey 共4个步骤。
SubBytes
在这一步骤中,首先,需要逐个字节的对16字节的输入数据进行 SubBytes 处理。从一张拥有256个值的 替换表 中找到对应的对应值,进行替换。相当于前面所说的替换密码的256个字母版本。
ShiftRows
在 ShiftRows 这一步中,将以4字节为单位的行按照一定的规则向左平移,且每一行平移的字节数是不同的。
MixColumns
在 MixColumns 这一步中,对一个4字节的值进行比特运算,将其变成另外一个4字节的值。
AddRoundKey
最后需要对 MixColumns 的结果进行 AddRoundKey 操作。在这一步中,主要是对 MixColumns 的结果与 轮密钥 进行 XOR 操作。
综上所述, Rijndael 的加密过程中,每一轮所进行的处理为:
SubBytes → ShiftRows → MixColumns → AddRoundKey
而解密时,则与加密相反,即:
AddRoundKey → InvMixColumns → InvShiftRows → InvSubBytes
针对Rijndael的攻击
攻击方式和之前介绍的攻击方式差不多。但 Rijndael 的算法有着严谨的数学结构,不排除有破译者通过公式推导实现破译的可能。