前段时间看了一下DES 与 AES 的加密原理,为了以后温故知新,特意记录下来。
数据加密标准(DES,Data Encryption Standard)是一种使用密钥加密的块密码,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。它基于使用56位密钥的对称算法。这个算法因为包含一些机密设计元素,相对短的密钥长度以及怀疑内含美国国家安全局(NSA)的后门而在开始时有争议,因此DES因此受到了强烈的学院派式的审查,并以此推动了现代的块密码及其密码分析的发展。
DES算法是一种用56位密钥来加密分组长度为64位数据的对称密钥算法(实际上函数要求一个64位的密钥作为输入,但是第8、16、24、32、40、48、56、64 等8位是校验位, 使得每个密钥都有奇数个 1,所以参与加密过程的只有56位)。
DES算法的入口参数有三个:
DES的解密过程和加密相似,解密时使用与加密同样的算法,不过子密钥(见文中解释)的使用次序要反过来。
DES算法整体流程图如下所示,
图1 DES算法整体流程图
下面根据上图从上到下介绍每个操作。
将64 bit明文的位置进行置换,得到一个乱序的64 bit明文组,而后分成左右两段,每段为32bit,以L0和R0表示,IP中各列元素位置号数相差为8,相当于将原明文各字节按列写出,各列比特经过偶采样和奇采样置换后,再对各行进行逆序。将阵中元素按行读出构成置换输出,初始置换表如图2所示。
即将输入的第58位换到第一位,第50位换到第2位,…,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左 32位,R0 是右32位,例:设置换前的输入值 D1D2D3……D64,则经过初始置换后的结果为:L0=D58D50…D8;R0= D57D49…D7。具体的置换效果如图3所示。
图3 置换效果图
乘积变换是DES算法的核心部分,此步骤需要经历16轮,而且每一轮变换都需要一个48bit子密钥,共需要16个48bit密钥。将经过IP置换后的数据分成32 bit的左右两组,在迭代过程中彼此左右交换位置。每次迭代时只对右边的32 bit进行一系列的加密变换,在此轮迭代即将结束时,把左边的32 bit与右边得到的32bit做异或运算,作为下一轮迭代时右边的段,并将原来右边未经变换的段直接送到左边的寄存器中作为下一轮迭代时左边的段。
在每一轮迭代时,右边的段要经过选择扩展运算E、密钥加密运算、选择压缩运算S、置换运算P和左右数据段的异或运算。具体变换情形如下图4所示。
(1)选择扩展运算E
将输入的32 bit Ri-1扩展成48 bit的输出,对原第1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29,32各位都重复一次,实现数据扩展。将表中数据按行读出得到48 bit输出。扩展效果如下图5所示。
图5-2 选择扩展运算效果图
(2)获取子密钥进行加密运算
子密钥的产生过程如下图6所示,
图6 展示出了一个64比特的外部密钥经过密钥产生器产生16个48bit子密钥的过程,依次经过了置换1、循环左移、压缩置换。下面分别介绍子密钥产生器的各个部分。
1) 置换1
将56比特密钥K’各位上的数按规定方式进行换位。置换后的56bit分别存到两个28bit的寄存器中,如下图7 所示。
从上图7中可以看出,C0的各位依次为原密钥中的57,49,41,…,36位,D0的各位依次为原密钥中的63,55,…,4位。
2) 循环左移
每个循环左移寄存器都有28比特,加密时,循环寄存器对C(i+1)、D(i+1)的内容是将循环寄存器对C(i)、D(i)的内容分别左移1至2位得到的。各级寄存器移位的比特数如下图8所示。
3) 压缩置换
从56bit的数据中选出48bit,产生16轮加密的16个48bit子密钥。压缩置换表如下图9所示。
(3)选择压缩算法S
将前面送来的48比特数据从左至右分成8组,每组为6比特,然后并行送入8个S盒。8个S盒的工作原理都是一样,为一个非线性替换运算。每个S盒都是一个4行、16列的矩阵,每行都是0到15的数字,但每行的数字排列都不同。每个S盒有6位输入,4位输出,6位输入中的第1位和第6位数字组成的二进制数值决定置换矩阵的行数,其余4位数字所组成的二进制数值决定置换矩阵的列数,行数和列数交点的数字便是S盒的输出。S盒信息如下图10所示。
例:假设S1盒的输入110010, 因第1位和第6位数字组成的二进制数为10=(2)10,他对应S1行号为2的那一行,其余4位数字所组成的二进制数为1001=(9)10,对应S1列号为9的那一列,交点处的数是12,则S1的输出为1100。
(4)置换运算P
对S1至S8盒输出的32 bit数据进行坐标置换,坐标如下图11所示。
置换P输出的32 bit数据与左边32 bit即Li-1做异或运算,所得到的32 bit作为下一轮迭代用的右边的数字段。并将Ri-1并行送到左边的寄存器,作为下一轮迭代用的左边的数字段。
逆初始置换IP-1是DES加密过程的最后一步,它的作用打乱重排第十六次加密迭代的结果然后形成64位密文,是初始置换IP的逆置换,置换矩阵如下图12所示。
到了这一步,DES的加密过程就结束了。DES的解密运算可以和加密运算用同一个算法,当然,两者之间还是有一些不同之处的,那就是它们使用子密钥的顺序是相反的。将64位的密码作为明文输入进去,K16作为第一次的解密迭代子密钥来使用,K15作为第二次的解密迭代使用,…,一直到K1作为最后一次(即第十六次)的解密迭代子密码,然后输出的就是64位明文了。这个就是与加密使用共同运算方法但使用相反顺序子密钥的解密过程了。
AES加密算法即密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。
AES是一个迭代分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文,其分组长度和密钥长度都是可变的,只是为了满足AES的要求才限定处理的分组大小为128位,而密钥长度为128位、192位或256位,相应的迭代轮数N,为10轮、12轮、14轮。AES汇聚了安全性能、效率、可实现性、灵活性等优点。最大的优点是可以给出算法的最佳查分特征的概率,并分析算法抵抗查分密码分析及线性密码分析的能力。
AES算法,基本变换包括SubBytes(字节替代)、ShiftRows(行移位)、MixColumns(列混淆)、AddRoundKey(轮密钥加 以及KeyExtension(密钥扩展)。加密过程如下图1所示。
AES的处理单位是字节,128位的输入明文分组P和输入密钥K都被分成16个字节,分别记为P = P0 P1 … P15 和 K = K0 K1 … K15。如,明文分组为P = abcdefghijklmnop,其中的字符a对应P0,p对应P15。一般地,明文分组用字节为单位的正方形矩阵描述,称为状态矩阵。在算法的每一轮中,状态矩阵的内容不断发生变化,最后的结果作为密文输出。该矩阵中字节的排列顺序为从上到下、从左至右依次排列,如下图2所示:
128位密钥也是用字节为单位的矩阵表示,矩阵的每一列被称为1个32位比特字。通过密钥编排函数该密钥矩阵被扩展成一个44个字组成的序列W[0],W[1], … ,W[43],该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,后面40个字分为10组,每组4个字(128比特)分别用于10轮加密运算中的轮密钥加,如下图3所示:
从图1中可以看到,在右部的key schedule部分, 后面10轮的密钥是根据初始密钥依次生成的,每一轮的密钥都是依据上一轮生成的,所以每一轮的密钥都是不同的。
AES的整体简化结构如下图4所示,其中的W[0,3]是指W[0]、W[1]、W[2]和W[3]串联组成的128位密钥。加密的第1轮到第9轮的轮函数一样,包括4个操作:字节代换、行位移、列混合和轮密钥加,最后一轮迭代不执行列混合。另外,在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作。
上图展示了AES加解密的简化流程,解密过程仍为10轮,每一轮的操作是加密操作的逆操作。由于AES的4个轮操作都是可逆的,因此,解密操作的一轮就是顺序执行逆行移位、逆字节代换、轮密钥加和逆列混合。同加密操作类似,最后一轮不执行逆列混合,在第1轮解密之前,要执行1次密钥加操作。
下面分别介绍AES中一轮的4个操作阶段。
字节代换操作就是查表操作,AES算法设置了一个S盒和一个逆S盒分别用于加密和解密。状态矩阵中的元素按照下面的方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出。例如,加密时,输出的字节S1为0x12,则查S盒的第0x01行和0x02列,得到值0xc9,然后替换S1原有的0x12为0xc9。状态矩阵经字节代换后的图如下图5所示:
同理,逆字节代换也就是查逆S盒来变换。
图5-2 S逆盒矩阵
行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节,如下图6所示:
将一个常量矩阵与第二部产生的状态矩阵相乘得到的状态矩阵就是经过列混合的状态矩阵,如下图7所示,
例如,
将上一步生成的状态矩阵与本轮生成的加密矩阵进行异或运算即可。