【Cryptography】DES、AES对称加密
XOR加密
一、 XOR 运算
逻辑运算之中,除了 AND
和 OR
,还有一种 XOR
运算,中文称为"异或运算"。
它的定义是:两个值相同时,返回false
,否则返回true
。也就是说,XOR
可以用来判断两个值是否不同。
1
2
3
4 true XOR true // false
false XOR false // false
true XOR false // true
true XOR false // true
JavaScript 语言的二进制运算,有一个专门的 XOR 运算符,写作^
。
1
2
3
4 1 ^ 1 // 0
0 ^ 0 // 0
1 ^ 0 // 1
0 ^ 1 // 1
上面代码中,如果两个二进制位相同,就返回0
,表示false
;否则返回1
,表示true
。
二、 XOR 的应用
XOR 运算有一个很奇妙的特点:如果对一个值连续做两次 XOR,会返回这个值本身。
1
2
3
4
5 // 第一次 XOR
1010 ^ 1111 // 0101
// 第二次 XOR
0101 ^ 1111 // 1010
上面代码中,原始值是1010
,再任意选择一个值(上例是1111
),做两次 XOR,最后总是会得到原始值1010
。这在数学上是很容易证明的。
三、加密应用
XOR 的这个特点,使得它可以用于信息的加密。
1
2 message XOR key // cipherText
cipherText XOR key // message
上面代码中,原始信息是message
,密钥是key
,第一次 XOR 会得到加密文本cipherText
。对方拿到以后,再用key
做一次 XOR 运算,就会还原得到message
。
DES加密
简介
DES加密是“对称密码”算法中的
分组加密
,与之对应的是流密码
:逐个字节就行加密分组长度:明文和密文为64位分组长度
迭代轮数:每个组合先代换后置换,共16轮
密钥长度:56位(64位-8位奇偶校验位=56位),但存在弱密钥,容易避开。
特点:
1、对称加密
2、全程只用一个密钥
当n个64位明文数据块经过DES加密后,得到的n个64位密文数据块,将他们串在一起就是密文
步骤一、进行IP置换
例如:58表示,将原来的64位中,第58个放到目前的第1位;后面都按这个规则
步骤二、F轮函数
E扩展
- 将32位扩展为48位,方法:将32位分成8组,每组4个bit
- 在每组最前面加上【前一组原始】的第4位。把32位首尾连接,那第一组的最前面,要加上最后一组最后一个bit
- 在每组最后面加上【后一组原始】的第1位
另一个图,也可以加强解释
异或
将E扩展出来的48位,与48位密钥进行异或
S盒压缩
S盒压缩直观图
- 经过扩展的48位明文和48位密钥进行异或运算后,再使用8个S盒压缩处理得到32位数据。
- 将48位输入等分为8块,每块
6位
输入压缩为4位
输出
根据下面这个表进行压缩
S盒压缩举例
- 第一组为
6个1
,将头部和尾部2个1
拿出来,再转成10进制,对应结果是3 - 中间数据也置换成10进制,对应结果是15
- 3,作为行数;
- 15,作为列数;
- 按
S1
(因为是第1组,一共8组嘛)的第3行
,第15列
查表,得到13
这个结果 - 再将13,置换成二进制,
1101
- 1101就是最终4bit输出
P置换
这个P置换和前面的ip置换相近,比如将第16位放到第1位
至此一轮完成,再将
P置换的结果
与L0
进行异或
。得到的结果赋值给R1R1作为下一次的L1
L1(由之前的R0得到)作为下一次参加轮换的参数
经过16次,得到R16与L16,将其拼接后,经过一次逆置换,得到最终结果
密钥生成
统揽全局
密钥为64位,除去8位校验位,剩余56位参与运算
按照交换规则,生成16个48位轮密钥,轮密钥也叫子密钥,原密钥也叫组密钥
详细过程
将64位的组密钥,去除8个校验位(第8、16、24……64位)后,剩下56位,按==PC-1表==进行置换,打乱顺序。然后分成两个28位,一组为C0,另一组为D0。
随后需要进行循环左移,左移1或2次(根据当前轮数查表决定)
比如第7轮需要左移2次,经过左移操作后得到C7和D7,C7和D7组合成56位
随后将得到的56位(C7+D7)按==PC-2表==进行置换,置换中会有8位被去除,从而得到48位子密钥Ki(i代表轮数)
PC-1表是56位,PC-2表是48位。
PC表是用来做置换的,如果PC表上,第1位有数字58,表示:将原来64位中,第58个数字放在当前位置。
PC-1表每行的第8列没有了(相当于去除了校验位8、16、24……)
下面是举例说明
红色数字是校验位,随后将64位密钥按PC-1表进行置换,比如图中PC-1表的第1位是57,表示:将原64位中的第57位数字“1”放在第1位,后续相同。由于PC-1的每行没有第八列,所以,原64位中的校验位都会被去除。
得到C0和D0子密钥
随后,查表进行循环左移,这里第1轮循环左移1次,从而得到C1和D1(各自28位,共56位)
随后,再进行PC-2表进行置换,方式和之前相同,合并结果后,得到两个24位,共48位的K1
DES加密特点
AED加密
AES属于分组加密算法
明文
长度固定为128位
(16个字节)密钥长度可以是128或192或256位
128位密钥会循环10轮,192位循环12轮,256位循环14轮
特点:
1、对称加密
2、一个密钥扩展成多个子密钥,轮加密
如果明文分的分组一样,得到的密文分组也是一样
下面将假设,明文与密钥均为128bit(16字节)
加密过程
- 最后一轮【最终轮】
没有列混合
初始变换
- 按
字节异或操作
,得到结果就是初始变换的结果,将明文转成4x4的矩阵,矩阵中每个值是2个字节(按16进制显示)
对应位置
进行异或
步骤二、9轮循环
字节代换
循环中的第一个步骤
- 将4*4矩阵中的每个值(每个值是8位,并按16进制显示),经过查表,进行代换
比如:19,第“1”行第“9”列,对应d4
代换结果如下
行移位
- 第一行保持不变
- 第二行,向左平移一位
- 第三行,向左平移二位
- 第四行,向左平移三位
列混合
将行移位的结果,乘以“固定的”矩阵【是提前设定的】
比如:
轮密钥加
将列混合后的结果
【4*4矩阵】,再与轮密钥
【4*4矩阵】进行异或
上面的轮密钥,是由子密钥进行扩展得到的,后面会讲
再回顾下AES加密过程,简单来说,上面的步骤就已经完成了AES加密。
后面会讲密钥扩展,如何从
子密钥
,产生10轮中不同的轮密钥
密钥扩展
初始密钥是个4*4矩阵,经过密钥扩展,要生成10个轮密钥
按矩阵的每列【下标从0开始】,按它是否为4的倍数
,分成两种扩展方式
列数是4倍数
将W[i-1]
经过字循环、字节代换、轮常量异或的结果
,再与W[i-4]
进行异或
举例
举例:求密钥W[4]列,即i=4,上图标红的
因为W[4]=W[4-4]异或T(W[4-1])即:
W[4]=W[0]异或T(W[3])
因为W[0]已经知道,下面需要计算T(W[3])
字循环
先将W[i-1]进行字循环,当前i=4,即W[3]
先将W[3]字循环
字节代换
W[3]字循环后的结果,再进行字节代换,按S盒进行字节替换
轮常量异或
刚刚得到的字节代换结果
【橙色】再与第1列轮常量(W[i-4],当前i=4)
【蓝色】进行异或
W[1]
【蓝色】再与上面得到的W[3]
经过3步操作后的结果【红框】进行异或,得到W4
【灰色】结果
列数不是4的倍数
没上面那么复杂
W[i]=W[i-4]异或W[i-1]
10轮后,得到10个轮密钥
深色灰是4的倍数,浅色灰不是4倍数