a*算法流程图_对称加密与非对称加密算法原理详解(对称加密篇)

f50c9aba61e23b391959b1e429e53c13.png

浙江邮电工程建设有限公司大数据研究院 ——段兴才

众所周知数据对于一个公司来说,非常重要,一旦数据泄露,公司将面临非常大的威胁,数据加密非常重要。

对称加密是指加密和解密使用相同密钥的加密算法,常见的对称加密算法有DES,DES3,AES加密算法。对称加密由于其加解密速度快,常被用于大量的数据加密场景,还有对传输效率要求高的场景如VPN之间的传输,但是由于其密匙不方便保存,所以适合于内部系统。

1 DES加密算法

DES加密算法是一种分组加密算法,通过将输入的明文按64位一组,进行分组加,加密过程分为初始置换明文,分组明文,生成子密匙,密匙与明文加密,经过S盒替(如表1.14所示),P盒替换(如图1.16所示),置换后的密文与原32位明文加密。具体流程图如下图1.1 DES加密流程图

af3c8fcb82e1bf24f4d85883d21ea430.png

图1.1 DES流程图

初始置换:初始置换是只将输入的64位明文,按照一个置换表进行置换位置,具体置换规则:初始数据里面的64是1号位,置换表的1则到了第40这个位置,那么64置换之后就到了第40这个位置、63是原来的2号位,在置换表里面是第8号位,所以63经过置换表则到了第8位,其他的位置执行同样的操作,具体操作如表1.1,表1.2,表1.3:

表1.1 初始数据表

13d82a71efd64b124e9f2a1ecdce77ad.png

表1.2 置换表

9425314dc4771094f20d6e9a66e59e95.png

表1.3 置换后数据

a7f29b3ea20f8aeb3c2babc2e470f63a.png

拿到置换后的数据后,将明文分组左右两组。将初始置换之后的数据按前32位为左边L0,后32位为右边R0。具体分组如表1.4,1.5.

表1.4 左边L0

281f6c511e7c42bb76a335a10ab64ea9.png

表1.5 右边R0

c937079a37426890f96fda22e1b7d405.png

主密匙是用户定义的一个密匙,将一个主密匙生成16个子密匙,每一次操作用一个密匙。用户设置的一个64位key,我们将其忽略第8,16,24,32,40,48,56,64奇偶检验位。得到一个56位key,将其进行移位操作,再进行压缩置换就得到具体加密的KEY。具体操作如表1.6 所示

表1.6 移位操作是移位表

79a68954d345d9c14c98d9af08e3da9d.png

从表中我们可以知道,第一轮是左移一位,第三轮是左移两位,后面一堆位数安按照1.6所示即可。具体移位如表1.7,表1.8

表1.7 主密匙表

fb6bd49bf94c70fc6fc3b4fabc5f28de.png

表1.8 左移一位后的密匙

fc42b6a1060a55e2ef48eac506b92ab2.png

移位之后进行压缩置换,将56位的密匙进行48位的置换表置换,得到48位密匙舍去8位,如表1.9,1.10,表1.11所示

表1.9 密匙

2c12d40b53acef6192a973c51d9a6519.png

表1.10 48位置换表

3f8fed2ed85d36ba2c9a4bb5c922d5a4.png

表1.11 置换之后得到的数据KEY1

7d9e5b919b411125d05274b1b0a3d5dd.png

得到48位密匙后,因为明文分组是32位,所以对明文进行扩充置换成48位,以下操作是对明文进行扩充置换,对于扩充后的明文我们可以发现,他中间四列是原来的明文,并没有修改,增加的第一列是原明文的最后一列从倒数排列,新添加的第后一列,则是第一列的倒数。具体如表1.12,表1.13所示。

表1.12 左边明文L0

eb0bbeda7c523bc8f24daca3a030353e.png

表1.13 扩充之后的明文L0

bf9fb4e14afe9ce003067840ef9ea90d.png

现在得到48位密匙和48位数据,就可以进行异或加密操作了。异或操作后面拿到的数据是加密后的数据,我们对此数据进行S盒替换和P盒替换。

S盒替换是将48位的数,分组8组,一组6位,进入S盒,一个S盒6位输入4位输出,及48位出入,进入8个S盒输出只有32位。具体替换如表1.14。

表1.14 S0盒:

b21b2f79d15e36a98aeed8be83828dce.png

例如:输入为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盒替换后的数据

f09763264f77c4d4e33068fa0cd11db5.png

表1.16 P盒

801f43b7a3840e0d34f21714250484ce.png

表1.17 P盒置换后的数据

de0bfea1a3b949b9ac020c487e49b41f.png

现在我们已经拿到P盒置换后的数据了,再跟我们第一次分组生成的32位左边的数据进行异或操作,这次拿到的数据就是我们第一轮加密后的数据,再进行左右互换,进行同样的加密操作,连续操作16次,加密就算完成了。

加密完成了,接下来就是解密了,解密和加密是同样的操作,输入64位明文,进行初始置换,将KEY倒着进行加密,密匙移位,加密是向左移,那么解密就是向右移,执行同样的操作就可以解密进行解密操作。

2 AES加密算法

AES加密算法是分组加密,每一组是16字节,是目前主流的高级加密算法。他的加密过程主要分为密匙轮询,字节替代,行移动,列混合,密匙加轮…….以上操作重复10次,输出的即是加密的数据,具体流程图如1.2所示

f74849337353b5ff3db5b6ee7b5e9fed.png

图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 轮询常量表

21c283e78b7c9385e3c03c50ac147a7e.png

例如:

初始密匙

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所示

94549be86b041a6fb09f178ad664735d.png

图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 轮询后的数据

d8e8f134e82bd47e22f1aa3dd378285b.png

表2.3 转化为16进制

b1c714597d08715a5b00191010ecde9c.png

表2.4S盒替代之后的数据

945cb972f3469a404e7b224078cb4b8c.png

S盒如图1.3所示,如果替换后出来本就是16进制的数则不需要转换,如果不是将a转为16进制0x61则在S盒中找到第6行第1个数,这个数就是要替换的数,替换其他数也是同样的操作。

接下来就是行移动,列混合就是将每一列移动不同的位数,第一列不移动,第二列移动一位,第三列移动两位,第四列移动三位。具体一位如下表2.5,2.6:

表2.5 移位前的数据

58cc1b7183c847e1175b19fea0aa1e8b.png

表2.6 移位后的数据

25ae9deb307dd556e43f11c40b340199.png

行移动后就是列混合了,列混合就是将行移动后的矩阵乘一个固定矩阵。具体如下表2.7,2.8所示

表2.7行移动后的数据

f7ac9774f8755386b30978a787085bdf.png

表2.8先转10进制

9710f2881e1eb74751fd4109721c1f22.png

转10进制进行与固定矩阵相乘

a161106e96ba4698cb76df622486a0d5.png

得到结果矩阵后,将其转为16进制,到此第一轮加密结束,后续只需将结果矩阵当成第2个KEY进行执行同样的加密操作。

解密操作和加密操作一样,用最后一组密匙对密文进行密匙轮询,再用逆S盒进行字节替代,行移动是向右移动,列混合是乘固定矩阵的逆矩阵,后面操作与前面操作一样,轮询10次即可解密回来。

AES加密的代码实现,由于代码过多,只列出主要加密,解密代码,具体代码如图2.3,2.4,2.5,2.6所示

AES加密代码

e624eb0c85d517f4cda2b4942cf0d00c.png

图2.3 AES加密代码

AES解密代码

1edc61887f9dc9f41ae154871e62df00.png

图2.4 AES解密代码

AES输出代码

39db639aff25fd03b51d44eb8947bae8.png

图2.5 AES输出代码

c7b839bfde33b855da4576a60fbe3e4f.png

图2.6 AES加密输出,解密回来结果

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页