这是关于密码学笔记的第三篇专栏文章。在本文中,我们首先介绍的是XOR运算,该运算在密码学中有着极大的用处。其次,我们将介绍一次性密码本,该密码系统已被证明是绝对无法被破译的。之后,我们将重点介绍几种对称密码算法,包括DES、三重DES、AES以及Rijndael。最后,我们将谈谈在众多的对称密码算法中应该如何取舍。
跟诸位大牛相比,笔者阅历尚浅、经验不足,笔记中若有错误,还需继续修正与增删。欢迎大家的批评与指正。
查看上一篇请点击以下链接:【密码学笔记】第2部分 历史上的密码
文章目录
1. XOR运算
2. 一次性密码本
3. 对称密码算法
3.1 DES
3.2 三重DES
3.3 AES
3.4 Rijndael
4. 对称密码的选择
5. 对称密码的评价
参考书目
1. XOR运算
XOR运算,又称为异或运算,运算结果是同0异1。
对同一个比特序列进行两次XOR之后就会回到最初的状态,因此XOR运算可用于对称密码的加密和解密。
2. 一次性密码本
一次性密码本(又称为维纳密码)是一种非常简单的密码,它的原理是“将明文与一串随机的比特序列进行XOR运算”。
一次性密码本是无法破译的。这是因为在对它尝试解密的过程中,所有的排列组合都会出现,既会包含规则字符串,也会包含英文单词,还会包含乱码。由于明文中所有可能的排列组合都会出现,因此我们无法判断其中哪一个才是正确的明文。
一次性密码本是一种非常不实用的密码。原因如下:
a. 密钥的配送。(最大的问题)如果能够有一种方法将密钥安全地发送出去,那么就可以用同样的方法安全地发送明文。
b. 密钥的保存。密钥的长度必须和明文的长度相等。如果能够有办法安全保存与明文一样长的密钥,那就有办法安全保存明文本身。
c. 密钥的重用。在一次性密码本中绝对不能重用过去用过的随机比特序列,因为作为密钥的比特序列一旦泄露,过去所有的机密通信内容将全部被解密。
d. 密钥的同步。在通信过程中,发送者和接收者的密钥的比特序列不允许有任何错位,否则错位的比特后的所有信息都将无法解密。
e. 密钥的生成。一次性密码本需要生成大量的随机数,这里的随机数并不是通过计算机程序生成的伪随机数,而必须是无重现性的真正随机数。
一次性密码本的思路孕育出了流密码。流密码使用的不是真正的随机比特序列,而是伪随机数生成器产生的比特序列。流密码虽然不是无法破译的,但只要使用高性能的伪随机数生成器,就能够构建出强度较高的密码系统。
3. 对称密码算法
3.1 DES
DES是一种将64比特的明文加密成64比特的密文的对称密码算法,它的密钥长度是56比特。
DES是以64比特的明文(比特序列)为一个单位来进行加密的,这个64比特的单位称为分组。以分组为单位进行处理的密码算法称为分组密码。
DES每次只能加密64比特的数据,如果要加密的明文比较长,就需要对DES加密进行迭代,而迭代的具体方式就称为模式(mode)。
DES的基本结构又称为Feistel网络,这一结构不仅被用于DES,在其他很多密码算法中也有应用。在Feistel网络中,加密的各个步骤称为轮(round),整个加密过程就是进行若干次轮的循环。下图展现的是Feistel网络中一轮的计算流程。DES是一种16轮循环的Feistel网络。
一轮的具体计算步骤如下:
a. 将输入的数据等分为左右两部分;
b. 将输入的右侧直接发送到输出的右侧;
c. 将输入的右侧发送到轮函数;
d. 轮函数根据右侧数据和子密钥,计算出一串看上去是随机的比特序列;
e. 将上一步得到的比特序列与左侧数据进行XOR运算,并将结果作为加密后的左侧。
我们需要用不同的子密钥对一轮的处理重复若干次,并在每两轮处理之间将左侧和右侧的数据对调。
Feistel网络的解密操作只要按照相反的顺序来使用子密钥就可以完成了。
Feistel网络的性质:
a. 轮数可以任意增加;
b. 加密时无论使用任何函数作为轮函数都可以正确解密(即使该函数不存在反函数);
c. 加密和解密可以用完全相同的结构来实现。
综上所述,无论是任何轮数、任何轮函数,Feistel网络都可以用相同的结构实现加密和解密,且加密的结果必定能够正确解密。
3.2 三重DES
三重DES是为了增加DES的强度,将DES重复3次所得到的一种密码算法,也称为TDEA,通常缩写为3DES。
明文经过三次DES处理才能变成最后的密文,由于DES密钥的长度实质上是56比特,因此三重DES的密钥长度就是168比特。
三重DES并不是进行三次DES加密,而是加密→解密→加密的过程,目的是让三重DES能够兼容普通的DES,当所有密钥都相同时,三重DES也就等同于普通的DES。
如果密钥1和密钥3使用相同的密钥,而密钥2使用不同的密钥,这种三重DES就称为DES-EDE2。密钥1、密钥2、密钥3全部使用不同的比特序列的三重DES称为DES-EDE3。
尽管三重DES目前还被银行等机构使用,但其处理速度不高,除了特别重视向下兼容性的情况以外,很少被用于新的用途。
3.3 AES
AES是取代其前任标准(DES)而成为新标准的一种对称密码算法。全世界的企业和密码学家提交了多个对称密码算法作为AES的候选,最终选出了一种名为Rijndael的对称密码算法,并将其确定为AES。
AES的选拔并不仅仅考虑一种算法是否存在弱点,算法的速度、实现的容易性等也都在考虑范围内。此外,这种算法还必须能够在各种平台上有效工作。
3.4 Rijndael
Rijndael是由比利时密码学家设计的分组密码算法,被选为新一代的标准密码算法——AES。
和DES一样,Rijndael算法也是由多个轮构成的,其中每一轮分为SubBytes、ShiftRows、MixColumns和AddRoundKey共4个步骤。DES使用Feistel网络作为其基本结构,而Rijndael使用的是SPN结构。
加密过程:
a. 首先,需要逐个字节地对16字节的输入数据进行SubBytes处理,即以每个字节的值(0~255)为索引,从一张拥有256个值的替换表(S-Box)中查找出对应值(类似于简单替换密码)。
b. 进行ShiftRows处理,即以4字节为单位的行(row)按照一定的规则向左平移,且每一行平移的字节数是不同的。
c. 进行MixColumns处理,即对一个4字节的值进行比特运算,将其变为另外一个4字节值。
d. 最后,将MixColumns的输出与轮密钥进行XOR,即进行AddRoundKey处理。至此,Rijndael的一轮就结束了。实际上,在Rijndael中需要重复进行10~14轮计算。
在SPN结构中,输入的所有比特在一轮中都会被加密。和每一轮都只加密一半输入的比特的Feistel网络相比,这种方式的优势在于加密所需要的轮数更少。此外,这种方式还有一个优势,即SubBytes、ShiftRows和MixColumns可以分别以字节、行和列为单位进行并行计算。
在Rijndael的加密过程中,每一轮所进行的处理为:
SubBytes→ShiftRows→MixColumns→AddRoundKey
而在解密时,则是按照相反的顺序来进行的,即:
AddRoundKey→InvMixColumns→InvShiftRows→InvSubBytes
Inv表示与原始步骤相对应的逆运算。
解密过程:
Rijndael算法背后有着严谨的数学结构,即从明文到密文的计算过程可以全部用公式来表达,这是以前任何密码算法都不具备的性质。如果Rijndael的公式能够通过数学运算来求解,那也就意味着Rijndael能够通过数学方法进行破译,这也为新的攻击方式的产生提供了可能。
4. 对称密码的选择
(1) 因为现在用暴力破解法已经能够在现实的时间内完成对DES的破译,DES不应再用于任何新的用途。但是也需要保持与旧版本软件的兼容性。
(2) 尽管在一些重视兼容性的环境中会使用三重DES,但我们也没有理由将三重DES用于新的用途,它会逐渐被AES所取代。
(3) 现在应该使用的算法是AES(Rijndael),因为它安全、快速,而且能够在各种平台上工作。
(4) AES最终候选算法应该可以作为AES的备份,因为这些密码算法也都经过了严格的测试,且没有发现任何弱点。
(5) 一般来说,我们不应该使用任何自制的密码算法,而是应该使用AES。
5. 对称密码的评价
优点:
使用一种密钥空间巨大,且在算法上没有弱点的对称密码,就可以通过密文来确保明文的机密性。巨大的密钥空间能够抵御暴力破解,算法上没有弱点可以抵御其他类型的攻击。
不足:
a. 用对称密码进行通信时,还会出现密钥的配送问题,即如何将密钥安全地发送给接受者。为了解决密钥配送问题,需要公钥密码技术。
b. 尽管使用对称密码可以确保机密性,但仅凭这一点还并不能完全放心。例如发送者可能发送伪造的密文,并利用解密时返回的错误来盗取信息。
参考书目
[1] 《图解密码技术》(第3版),[日]结城浩著,周自恒译,人民邮电出版社,2014年。
衷心感谢您的阅读。
查看下一篇请点击以下链接:【密码学笔记】第4部分 分组密码的模式