所谓对称密码,是指在加密和解密时使用的都是同一密钥,比如之前提到的恺撒密码。而非对称密码,也称之为公钥密码,是指在加密和解密时使用不同密钥的方式。
本章会主要介绍几种对称密码,如DES、三重DES、AES等,在这之前,要先了解一下什么是比特序列运算。
1、比特序列运算
在这之前,我们先来看一个异或运算(不同取1,相同取0),假如有二进制数01001100为A,10101010为B,则两者异或结果为C:
A 0100 1100
B 1010 1010
C 1110 0110
将异或的结果C和B再进行异或运算,结果又会变回A:
C 1110 0110
B 1010 1010
A 0100 1100
上面的计算,就和加解密的步骤非常相似:
- A是明文,B是密钥,C是密文
- 发送者将A通过密钥B加密得到C,接收者将收到的C通过密钥B解密得到A
而我们知道,计算机的操作对象并不是文字,而是由0和1排列组成的比特序列。所以加密的过程,实际上就是将表示明文的比特序列,转换为表示密文的比特序列。
由于同一个比特序列进行两次异或运算后会回到最初的状态,不妨来一个由很多点组成的图像“字母D”,如下图,白点作为0,黑点作为1:
由此看到,这里使用的蒙版就是一个比特序列,使用异或运算将原来的图像进行了掩盖。 当然,这里只是为了形象地表示,实际上在计算机中,图片虽然也是0和1的序列,但并不是按如上使用0和1进行类似像素描点来展示的。但不论如何我们已经知道,数据可以通过一个随机的比特序列进行异或运算,达到加密的目的。
2、DES
Data Encryption Standard 是1977年美国联邦信息处理标准中采用的一种对称密码,但是随着计算机的进步,DES已经能够在数小时能被暴力破解,所以我们现在也不应该再使用DES了。
DES是一种将64比特的明文加密成64比特的密文的对称密码算法,这里的64比特的单位成为分组。DES的密钥长度为56比特,另外还有7比特用于设置错误检查。由于其基本结构是由Horst Feistel设计,因此也称为Feistel网络。
2.1 Feistel网络的加密
Feistel网络中,加密的各个步骤称之为“轮”,整个加密过程就是进行若干次轮循环。
Feistel网络中,每一轮都需要使用不同的密钥,因为它只是一个局部密钥,所以称为子密钥。加密算法如上图,明文被分为左侧和右侧两部分,轮函数根据右侧数据和子密钥,计算出一串比特序列,用该序列和左侧数据进行异或运算,作为加密后的左侧数据。
但这样一来右侧根本就没有加密,所以在下一轮需要将左右侧数据对调,再换一个子密钥继续进行加密,说白了,就是把之前没加密的右侧数据也加密。每轮处理32比特,最后一轮结束后不需要对调。
如下图加密96比特明文,即进行三轮加密:
2.2 Feistel网络的解密
不论轮函数具体是什么,根据异或运算的特性,Feistel网络的解密,只需要把每轮加密的结果使用相同的子密钥重新运算一次,即可还原为明文,如下图:
2.3 Feistel网络的性质
- 无论使用任何轮函数都可以正确解密
- 加密和解密可以用完全相同的结构来实现,只是循环次数不同
2.4 三重DES
三重DES就是将DES重复三次得到的一种密码算法,通常缩写为3DES。它的加密机制如下图所示:
由于DES密钥长度为56比特,所以三重DES的密钥长度则为56*3=168比特。
从上图我们可以看出,3DES并不是进行三次加密,而是进行了加密、解密、加密。这里加入解密是为了兼容原来的DES,将三重加密都使用相同密钥,那么在加密和解密后得到的还是明文,再进行第三次加密,即和原来的DES效果相同。因此,以前DES加密的秘闻,也可以通过3DES解密。
- 如果所有密钥都相同,则结果和普通的DES等价
- 如果密钥1、3相同,2不同,则称为DES-EDE2
- 密钥完全不同,则称为DES-EDE3
3DES的解密过程和加密过程正好相反,是以密钥3、2、1的顺序执行 “解密、加密、解密” 的操作。
尽管3DES目前还被银行等机构使用,但是其处理速度不高,且安全性方面也逐渐显现了一些问题。
3、AES
DES的安全性逐渐出现了一些问题,自然就出现了取代它的 Advanced Encryption Standard,这种加密算法是从众多候选算法中评选出的名为Rijndael的对称密码算法,确定其成为AES。Rijndael没有使用Feistel网络,而是使用了SPN结构。
DES的分组是64比特,而Rijndael的分组则是128比特,也就是16字节,它的算法首先需要逐个字节地进行SubBytes处理,所谓SubBytes,即以每个字节的值(0~255中任意值)为索引,从一张拥有256个值得替换表中找出对应值的处理,也就是说,把一个1字节的值替换为另一个1字节的值,这类似于简单替换密码,不过是256个字母的版本。
SubBytes之后要进行ShiftRows处理,即将SubBytes的输出以字节为单位进行打乱,这种打乱是有规律的。ShiftRows之后进行MixColumns处理,即对一个4字节的值进行比特运算,将其变为另一个4字节值。
最后,将MixColumns的输出与轮密钥进行异或运算(Rijndael算法也是和Feistel一样是采取轮的),即进行AddRoundKey,到这里,Rijndael的一轮就结束了。实际上,在Rijndael中需要重复进行10~14轮计算。这种算法和之前的Feistel相比,因为输入的所有比特都会被加密,而不是每轮只加密一半,所以优势在于加密所需要的轮数更少。
小结一下加密过程就是:
- SubBytes:16个字节,每个字节进行替换表替换
- ShiftRows:平移行(有规律平移,如下图,第一个字节移动到对应MixColumns的第一个字节,第二个字节对应第二个MixColumns的第二个字节,第三个对应第三个MixColumns的第三个,以此类推)
- MixColumns:对每4字节进行比特运算,变成另外的4字节值
- AddRoundKey:与轮密钥进行异或运算
解密过程则分别存在反向运算InvSubBytes、InvShiftRows、InvMixColumns,这是因为Rijndale不像Feistel网络一样可以使用同种结构实现加密和解密。
在书中提到,Rijndael还没有出现针对性的有效攻击,但因其背后有着严谨的数学结构,从明文到密文的计算过程可以全部用公式表达,意味着能够通过数学方法进行破译,这为新的攻击方式产生了可能。
尽管作者提到DES已能在数小时内破译,但可能涉于篇幅对于DES也没有案例进行破译讲解。所以DES和AES这部分的知识点大概也就这样理解吧,了解就行。核心还是在于对称密码的特点,即加密和解密使用相同的密钥,这里的两个算法都涉及以异或运算作为基础。