XOR加密

一、 XOR 运算

逻辑运算之中,除了 ANDOR,还有一种 XOR 运算,中文称为"异或运算"。

它的定义是:两个值相同时,返回false,否则返回true。也就是说,XOR可以用来判断两个值是否不同。

1
2
3
4
true XOR true // false
false XOR false // false
true XOR false // true
true XOR false // true

img

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

img

DES加密

简介

DES加密是“对称密码”算法中的分组加密,与之对应的是流密码:逐个字节就行加密

分组长度:明文密文为64位分组长度

迭代轮数:每个组合先代换后置换,共16轮

密钥长度:56位(64位-8位奇偶校验位=56位),但存在弱密钥,容易避开。

特点:

1、对称加密

2、全程只用一个密钥

当n个64位明文数据块经过DES加密后,得到的n个64位密文数据块,将他们串在一起就是密文

DES加密流程

image-20220615140627417

步骤一、进行IP置换

image-20220615141212380

例如:58表示,将原来的64位中,第58个放到目前的第1位;后面都按这个规则

步骤二、F轮函数

E扩展

image-20220615141408886

  • 将32位扩展为48位,方法:将32位分成8组,每组4个bit
  • 在每组最前面加上【前一组原始】的第4位。把32位首尾连接,那第一组的最前面,要加上最后一组最后一个bit
  • 在每组最后面加上【后一组原始】的第1位

另一个图,也可以加强解释

image-20220615141758831

异或

将E扩展出来的48位,与48位密钥进行异或

S盒压缩

S盒压缩直观图

S盒压缩

image-20220615141942964

  • 经过扩展的48位明文和48位密钥进行异或运算后,再使用8个S盒压缩处理得到32位数据。
  • 将48位输入等分为8块,每块6位输入压缩为4位输出

根据下面这个表进行压缩

S盒规则

S盒压缩举例

  • 第一组为6个1,将头部和尾部2个1拿出来,再转成10进制,对应结果是3
  • 中间数据也置换成10进制,对应结果是15
  • 3,作为行数;
  • 15,作为列数;
  • S1(因为是第1组,一共8组嘛)的第3行第15列查表,得到13这个结果
  • 再将13,置换成二进制,1101
  • 1101就是最终4bit输出

S盒压缩举例

P置换

image-20220615142454149

这个P置换和前面的ip置换相近,比如将第16位放到第1位

至此一轮完成,再将P置换的结果L0进行异或。得到的结果赋值给R1

R1作为下一次的L1

L1(由之前的R0得到)作为下一次参加轮换的参数

经过16次,得到R16与L16,将其拼接后,经过一次逆置换,得到最终结果


密钥生成

统揽全局

密钥为64位,除去8位校验位,剩余56位参与运算

按照交换规则,生成16个48位轮密钥,轮密钥也叫子密钥原密钥也叫组密钥

DES密钥生成流程图

详细过程

将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……)

密钥生成流程图


下面是举例说明

举例说明DES加密-1

红色数字是校验位,随后将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加密-2


DES加密特点

在这里插入图片描述

DES加密流程


AED加密

AES属于分组加密算法明文长度固定为128位16个字节

密钥长度可以是128或192或256位

128位密钥会循环10轮,192位循环12轮,256位循环14轮

特点:

1、对称加密

2、一个密钥扩展成多个子密钥,轮加密

如果明文分的分组一样,得到的密文分组也是一样

下面将假设,明文与密钥均为128bit(16字节)

16字节数据的排列方式

加密过程

AES加密过程

  • 最后一轮【最终轮】没有列混合

初始变换

  • 字节异或操作,得到结果就是初始变换的结果,将明文转成4x4的矩阵,矩阵中每个值是2个字节(按16进制显示)

初始变换过程

  • 对应位置进行异或

具体异或操作


步骤二、9轮循环

字节代换

循环中的第一个步骤

  • 将4*4矩阵中的每个值(每个值是8位,并按16进制显示),经过查表,进行代换

字节代换

比如:19,第“1”行第“9”列,对应d4

字节代换举例

代换结果如下

字节代换结果

行移位

  • 第一行保持不变
  • 第二行,向左平移一位
  • 第三行,向左平移二位
  • 第四行,向左平移三位

行移位

列混合

将行移位的结果,乘以“固定的”矩阵【是提前设定的】

列混合

比如:

列混合举例

轮密钥加

列混合后的结果【4*4矩阵】,再与轮密钥【4*4矩阵】进行异或

上面的轮密钥,是由子密钥进行扩展得到的,后面会讲

轮密钥加举例

再回顾下AES加密过程,简单来说,上面的步骤就已经完成了AES加密。

后面会讲密钥扩展,如何从子密钥,产生10轮中不同的轮密钥

AES加密过程


密钥扩展

初始密钥是个4*4矩阵,经过密钥扩展,要生成10个轮密钥

初始密钥

按矩阵的每列【下标从0开始】,按它是否为4的倍数,分成两种扩展方式

列数是4倍数

W[i-1]经过字循环字节代换轮常量异或结果,再与W[i-4]进行异或

公式

举例

W4扩展举例

举例:求密钥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]字循环

字节代换

W[3]字循环后的结果,再进行字节代换,按S盒进行字节替换

  • 字节代换

轮常量异或

刚刚得到的字节代换结果【橙色】再与第1列轮常量(W[i-4],当前i=4)【蓝色】进行异或

  • 轮常量异或
  1. W[1]【蓝色】再与上面得到的W[3]经过3步操作后的结果【红框】进行异或,得到W4【灰色】结果
    • image-20220615151547503

列数不是4的倍数

没上面那么复杂

W[i]=W[i-4]异或W[i-1]

列数不是4的倍数举例

10轮后,得到10个轮密钥

深色灰是4的倍数,浅色灰不是4倍数

image-20220615151638554