浙江邮电工程建设有限公司大数据研究院 ——段兴才
众所周知数据对于一个公司来说,非常重要,一旦数据泄露,公司将面临非常大的威胁,数据加密非常重要。
对称加密是指加密和解密使用相同密钥的加密算法,常见的对称加密算法有DES,DES3,AES加密算法。对称加密由于其加解密速度快,常被用于大量的数据加密场景,还有对传输效率要求高的场景如VPN之间的传输,但是由于其密匙不方便保存,所以适合于内部系统。
DES加密算法是一种分组加密算法,通过将输入的明文按64位一组,进行分组加,加密过程分为初始置换明文,分组明文,生成子密匙,密匙与明文加密,经过S盒替(如表1.14所示),P盒替换(如图1.16所示),置换后的密文与原32位明文加密。具体流程图如下图1.1 DES加密流程图
图1.1 DES流程图
初始置换:初始置换是只将输入的64位明文,按照一个置换表进行置换位置,具体置换规则:初始数据里面的64是1号位,置换表的1则到了第40这个位置,那么64置换之后就到了第40这个位置、63是原来的2号位,在置换表里面是第8号位,所以63经过置换表则到了第8位,其他的位置执行同样的操作,具体操作如表1.1,表1.2,表1.3:
表1.1 初始数据表
表1.2 置换表
表1.3 置换后数据
拿到置换后的数据后,将明文分组左右两组。将初始置换之后的数据按前32位为左边L0,后32位为右边R0。具体分组如表1.4,1.5.
表1.4 左边L0
表1.5 右边R0
主密匙是用户定义的一个密匙,将一个主密匙生成16个子密匙,每一次操作用一个密匙。用户设置的一个64位key,我们将其忽略第8,16,24,32,40,48,56,64奇偶检验位。得到一个56位key,将其进行移位操作,再进行压缩置换就得到具体加密的KEY。具体操作如表1.6 所示
表1.6 移位操作是移位表
从表中我们可以知道,第一轮是左移一位,第三轮是左移两位,后面一堆位数安按照1.6所示即可。具体移位如表1.7,表1.8
表1.7 主密匙表
表1.8 左移一位后的密匙
移位之后进行压缩置换,将56位的密匙进行48位的置换表置换,得到48位密匙舍去8位,如表1.9,1.10,表1.11所示
表1.9 密匙
表1.10 48位置换表
表1.11 置换之后得到的数据KEY1
得到48位密匙后,因为明文分组是32位,所以对明文进行扩充置换成48位,以下操作是对明文进行扩充置换,对于扩充后的明文我们可以发现,他中间四列是原来的明文,并没有修改,增加的第一列是原明文的最后一列从倒数排列,新添加的第后一列,则是第一列的倒数。具体如表1.12,表1.13所示。
表1.12 左边明文L0
表1.13 扩充之后的明文L0
现在得到48位密匙和48位数据,就可以进行异或加密操作了。异或操作后面拿到的数据是加密后的数据,我们对此数据进行S盒替换和P盒替换。
S盒替换是将48位的数,分组8组,一组6位,进入S盒,一个S盒6位输入4位输出,及48位出入,进入8个S盒输出只有32位。具体替换如表1.14。
表1.14 S0盒:
例如:输入为101110 那么他的第一位和最后一位组合10转换位10进制则为2及第2行,中间四为0111转为10进制及为7及第7列,所以第2行,第7列及为2转为2进制及为0010,所以输入101110,输出0010,S盒替换完成。经过S盒换以后就要经过P盒替换了,具体替换过程如下表1.15,1.16,1.17所示
表1.15 S盒替换后的数据
表1.16 P盒
表1.17 P盒置换后的数据
现在我们已经拿到P盒置换后的数据了,再跟我们第一次分组生成的32位左边的数据进行异或操作,这次拿到的数据就是我们第一轮加密后的数据,再进行左右互换,进行同样的加密操作,连续操作16次,加密就算完成了。
加密完成了,接下来就是解密了,解密和加密是同样的操作,输入64位明文,进行初始置换,将KEY倒着进行加密,密匙移位,加密是向左移,那么解密就是向右移,执行同样的操作就可以解密进行解密操作。
AES加密算法是分组加密,每一组是16字节,是目前主流的高级加密算法。他的加密过程主要分为密匙轮询,字节替代,行移动,列混合,密匙加轮…….以上操作重复10次,输出的即是加密的数据,具体流程图如1.2所示
图2.1 AES加密流程图
密匙加轮:用密匙与原文进行异或操作,原文是128位,密文也是128位,首先将主密匙与原文进行异或操作,后面再用主密匙生成40位子密匙。密匙生成过程如下所示:
KEY = 3C A1 0B 21 57 F0 19 16 90 2E 13 80 AC C1 07 BD
初始密匙:
W[0]=3C A1 0B 21
W[1]=57 F0 19 16
W[2]=90 2E 13 80
W[3]=AC C1 07 BD
生成密匙算法:
1.如果i不是4的倍数,那么第i列用如下公式:
W[i]=W[i-4] XOR W[i-1] (XOR表示异或的意思,下同)
2.如果i是4的倍数,那么第i列用如下公式:
W[i]=W[i-4] XOR T(W[i-1])
解释一下T()函数:由三部分组成,字循环,字节替代,轮常量代替异或。
a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[a0, a1, a2, a3]变换成 [a1,a2,a3,a0]。
b.字节代换:对字循环的结果使用S盒进行字节代换(具体S盒如图2.2所示)。
c.轮常量异或:将前两步的结果同轮常量进行异或。具体如表2.1所示
表2.1 轮询常量表
例如:
初始密匙
W[0]=3C A1 0B 21
W[1]=57 F0 19 16
W[2]=90 2E 13 80
W[3]=AC C1 07 BD
计算W[4],W[5],W[6],W[7]
求W[4]的时候,因为4是4的倍数,所以,我们先要求T(W[3])
W[3]= AC C1 07 BD
左移一位 得到 C1 07 BD AC
进入S和字节替换
进S盒替换时,例如替换C1,C则是行,1则是列,找到第C行第1列即可以找到替换的数字(16进制的数),S盒具体如图1.3所示
图2.2 S盒
C1在S盒中对应78,
07在S盒中对应C5
BD在S盒中对应7A
AC在S盒中对应 91
所以经过第二步S盒替换变成了78,C5,7A,91
(3).将78 C5 7A 91 XOR 01 00 00 00 = 79 C5 7A 91
所以计算密匙如下:
W[4]= W[0] XOR T(W[3] ) = 3C A1 0B 21 XOR 79 C5 7A 91 = 45 64 71 B0
W[5]= W[1] XOR W[4] = 57 F0 19 16 XOR 45 64 71 B0 = 12 94 68 A6
W[6]= W[2] XOR W[5] = 90 2E 13 80 XOR 12 94 68 A6 = 82 BA 7B 26
W[7]= W[3] XOR W[6] = AC C1 07 BD XOR 82 BA 7B 26 = 2E 7B 7C 9B
同样的方法计算其他密匙。
有了密匙,将明文与密匙异或运算,接下来进行字节替代。例如,假设我们明文与密匙加轮得到的数据是abcdefghijklmnop具体如表2.2,2.3,2.4所示
表2.2 轮询后的数据
表2.3 转化为16进制
表2.4S盒替代之后的数据
S盒如图1.3所示,如果替换后出来本就是16进制的数则不需要转换,如果不是将a转为16进制0x61则在S盒中找到第6行第1个数,这个数就是要替换的数,替换其他数也是同样的操作。
接下来就是行移动,列混合就是将每一列移动不同的位数,第一列不移动,第二列移动一位,第三列移动两位,第四列移动三位。具体一位如下表2.5,2.6:
表2.5 移位前的数据
表2.6 移位后的数据
行移动后就是列混合了,列混合就是将行移动后的矩阵乘一个固定矩阵。具体如下表2.7,2.8所示
表2.7行移动后的数据
表2.8先转10进制
转10进制进行与固定矩阵相乘
得到结果矩阵后,将其转为16进制,到此第一轮加密结束,后续只需将结果矩阵当成第2个KEY进行执行同样的加密操作。
解密操作和加密操作一样,用最后一组密匙对密文进行密匙轮询,再用逆S盒进行字节替代,行移动是向右移动,列混合是乘固定矩阵的逆矩阵,后面操作与前面操作一样,轮询10次即可解密回来。
AES加密的代码实现,由于代码过多,只列出主要加密,解密代码,具体代码如图2.3,2.4,2.5,2.6所示
AES加密代码
图2.3 AES加密代码
AES解密代码
图2.4 AES解密代码
AES输出代码
图2.5 AES输出代码
图2.6 AES加密输出,解密回来结果