流密码
逐位加密信息,将明文消息分解为单个位,然后使用密钥位将其分别转换为密文。流密码一次加密一位数据,而不用等待数据块的形成,此过程的关键在于根据加密密钥和种子(随机数nonce)生成伪随机比特流,它们一起创建了一个密钥流(伪随机比特流),该密钥流再与纯文本逐位进行异或运算,生成密文。因为每个数字的加密都取决于密码引擎的当前状态,所以流密码也被称为状态密码。
分组密码
顾名思义,分块加密信息;分组密码将明文消息分解为固定大小的块block,然后使用密钥将其转换为密文。例如,当提供了一个x位分块纯文本(连同一个密钥)作为块密码引擎的输入时,它会生成相应的x位密文块,此过程依赖于密钥,同样解密算法利用x位分块密文和上述密钥作为输入,恢复原始的x位。每块使用相同的密钥(单独)加密,但是由于使用了相同的密钥,所以纯文本中的每个重复序列都转换成了密码本中相同的重复序列,可能会引起安全问题。流行的块密码是DES(数据加密标准)和AES(高级加密标准)。
对比
流密码通常比分组密码执行得更快,当纯文本以不同数量可用时,比如一个安全的WIFI连接,流密码展现出比分组密码更大的优势,因为分组密码不能直接对小于块大小的块进行操作。但有时候,它们之间的差别不是很明显,这是因为当使用某些操作模式时,分组密码可以用作流密码,允许它加密可用的最小数据单元。
DES加密算法
该加密算法中,明文和密文为64位的文组文本,密钥长度也为64位,但是密钥的每组第8个位置设置为奇偶校验位,因而密钥实际长度为56位。
加密过程如下
-
初始置换
-
生成子密钥
-
迭代
-
逆置换
初始置换
将原文本经过IP置换表处理
58,50,42,34,26,18,10,02,
60,52,44,36,28,20,12,04,
62,54,46,38,30,22,14,06,
64,56,48,40,32,24,16,08,
57,49,41,33,25,17,09,01,
59,51,43,35,27,19,11,03,
61,53,45,37,29,21,13,05,
63,55,47,39,31,23,15,07,
例如如下64位的明文M
M = 0110001101101111011011010111000001110101011101000110010101110010
---
M' = 1111111110111000011101100101011100000000111111110000011010000011
L0 = 11111111101110000111011001010111
R0 = 00000000111111110000011010000011
在初始排列之后,我们有两个 32 位纯文本区域,分别称为左纯文本 L0 和右纯文本 R0。
子密钥生成
每次迭代过程的数据长度为48位,因此需要16个48位的子密钥来进行加密,生成子密钥的过程如下
PC-1表
去除校验位后,密钥第一轮置换,PC-1表8*7,密钥K经PC-1后变为56位数据K0。
57,49,41,33,25,17,09
01,58,50,42,34,26,18
10,02,59,51,43,35,27
19,11,03,60,52,44,36
63,55,47,39,31,23,15
07,62,54,46,38,30,22
14,06,61,53,45,37,29
21,13,05,28,20,12,04
Shift表
某一轮左移位数
PC-2表
由于PC-2表为8*6的表,经PC-2置换后的数据为48位,置换后得到子密钥K1,PC-2表中去除了第9,18,22,25,35,38,43,54位。
14,17,11,24,01,05,
03,28,15,06,21,10,
23,19,12,04,26,08,
16,07,27,20,13,02,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32
例如
K = 0001001100110100010101110111100110011011101111001101111111110001
第一轮置换
去除校验位,经过PC-1置换
K0 = 11110000110011001010101011110101010101100110011110001111
C0 = 1111000011001100101010101111
D0 = 0101010101100110011110001111
进行第一轮移位,左移1位
C1 = 1110000110011001010101011111
D1 = 1010101011001100111100011110
CD_1 = 11100001100110010101010111111010101011001100111100011110 (56位)
C1与D1合并,经过第一轮PC-2置换,去除了第9,18,22,25,35,38,43,54位
K1 = 000110110000001011101111111111000111000001110010 (48位)
第二轮置换
进行第二轮移位,左移1位
C2 = 1100001100110010101010111111
D2 = 0101010110011001111000111101
CD_2 = 11000011001100101010101111110101010110011001111000111101 (56位)
C2与D2合并,经过第二轮PC-2置换,去除了第9,18,22,25,35,38,43,54位
K2 = 011110011010111011011001110110111100100111100101
C3(28位) = 0000110011001010101011111111
D3(28位) = 0101011001100111100011110101
K3(48位) = 010101011111110010001010010000101100111110011001
C4(28位) = 0011001100101010101111111100
D4(28位) = 0101100110011110001111010101
K4(48位) = 011100101010110111010110110110110011010100011101
以此类推
迭代
设Li(32位)和Ri(32位)为第i次迭代结果的左半部分与右半部分,子密钥Ki为第i轮的48位加密密钥。定义运算规则:
Li = Ri-1;
Ri = Li ⊕ f(Ri-1, Ki);
扩展置换E
DES加密共执行16轮迭代,每次迭代过程的数据长度48位,然而初始置换完后每一半的长度为32位,如何扩展成48位?只是因为32位R0被分为8个块,每个块4位,每个块首尾各添加1个位,即可满足要求。
32, 01, 02, 03, 04, 05,
04, 05, 06, 07, 08, 09,
08, 09, 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 01
# Expansion D-box Table
exp_d = [32, 1 , 2 , 3 , 4 , 5 ,
4 , 5, 6 , 7 , 8 , 9 ,
8 , 9 , 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 1 ]
# Permute function to rearrange the bits
def permute(k, arr, n):
permutation = ""
for i in range(0, n):
permutation = permutation + k[arr[i] - 1]
return permutation
for i in range(0, 16):
# Expansion D-box: Expanding the 32 bits data into 48 bits
right_expanded = permute(right, exp_d, 48)
例如
R0 = 0000 0000 1111 1111 0000 0110 1000 0011
---
E(R0)^k1 = 100000 000001 011111 111110 100000 001101 010000 000110
S-BOX
由8个不同的代替盒(S盒)完成。每个S盒有6位输入,4位输出。代替运算流程如下
若S-盒1的输入为110111,第一位与最后一位构成11,十进制值为3,则对应第3行,中间4位为1011对应的十进制值为11,则对应第11列。查找S-盒1表的值为14,则S-盒1的输出为1110。8个S盒将输入的48位数据输出为32位数据。
S-盒1
14,04,13,01,02,15,11,08,03,10,06,12,05,09,00,07,
00,15,07,04,14,02,13,01,10,06,12,11,09,05,03,08,
04,01,14,08,13,06,02,11,15,12,09,07,03,10,05,00,
15,12,08,02,04,09,01,07,05,11,03,14,10,00,06,13,
S-盒2
15,01,08,14,06,11,03,04,09,07,02,13,12,00,05,10,
03,13,04,07,15,02,08,14,12,00,01,10,06,09,11,05,
00,14,07,11,10,04,13,01,05,08,12,06,09,03,02,15,
13,08,10,01,03,15,04,02,11,06,07,12,00,05,14,09,
S-盒3
10,00,09,14,06,03,15,05,01,13,12,07,11,04,02,08,
13,07,00,09,03,04,06,10,02,08,05,14,12,11,15,01,
13,06,04,09,08,15,03,00,11,01,02,12,05,10,14,07,
01,10,13,00,06,09,08,07,04,15,14,03,11,05,02,12,
S-盒4
07,13,14,03,00,06,09,10,01,02,08,05,11,12,04,15,
13,08,11,05,06,15,00,03,04,07,02,12,01,10,14,09,
10,06,09,00,12,11,07,13,15,01,03,14,05,02,08,04,
03,15,00,06,10,01,13,08,09,04,05,11,12,07,02,14,
S-盒5
02,12,04,01,07,10,11,06,08,05,03,15,13,00,14,09,
14,11,02,12,04,07,13,01,05,00,15,10,03,09,08,06,
04,02,01,11,10,13,07,08,15,09,12,05,06,03,00,14,
11,08,12,07,01,14,02,13,06,15,00,09,10,04,05,03,
S-盒6
12,01,10,15,09,02,06,08,00,13,03,04,14,07,05,11,
10,15,04,02,07,12,09,05,06,01,13,14,00,11,03,08,
09,14,15,05,02,08,12,03,07,00,04,10,01,13,11,06,
04,03,02,12,09,05,15,10,11,14,01,07,06,00,08,13,
S-盒7
04,11,02,14,15,00,08,13,03,12,09,07,05,10,06,01,
13,00,11,07,04,09,01,10,14,03,05,12,02,15,08,06,
01,04,11,13,12,03,07,14,10,15,06,08,00,05,09,02,
06,11,13,08,01,04,10,07,09,05,00,15,14,02,03,12,
S-盒8
13,02,08,04,06,15,11,01,10,09,03,14,05,00,12,07,
01,15,13,08,10,03,07,04,12,05,06,11,00,14,09,02,
07,11,04,01,09,12,14,02,00,06,10,13,15,03,05,08,
02,01,14,07,04,10,08,13,15,12,09,00,03,05,06,11,
例如
E(R0)^k1 = 100000 000001 011111 111110 100000 001101 010000 000110
S(E(R0)^k1) = 1000 1011 1100 0100 0110 0010 1110 1010
P-BOX
将S-盒替代的输出结果作为P-盒置换的输入。P-盒置换表如下:
16,07,20,21,29,12,28,17,01,15,23,26,05,18,31,10,
02,08,24,14,32,27,03,09,19,13,30,06,22,11,04,25,
将S盒输出10001011110001000110001011101010(32位)经过P盒置换,
P-盒置换输出01001000101111110101010110000001
令扩展置换E、S-盒替代、P盒置换的过程作为函数f。
第一次迭代过程f(R0,K1)为:
f(R0,K1) = 01001000101111110101010110000001
计算L1(32位) = R0 = 00000000111111110000011010000011
计算R1(32位) = L0 ^ f(R0,K1)
11111111101110000111011001010111
01001000101111110101010110000001
= 10110111000001110010001111010110
R1(32位) = 10110111000001110010001111010110。
将L1与R1作为输入,继续执行迭代过程f。直至输出L16与R16。
经过16次迭代后输出:
L16(32位) = 00110000100001001101101100101000
R16(32位) = 10110001011001010011000000011000
逆置换
将初始置换进行16次的迭代,即进行16层的加密变换,得到L16和R16,将此作为输入块,进行逆置换得到最终的密文输出块。逆置换是初始置换的逆运算。从初始置换规则中可以看到,原始数据的第1位置换到了第40位,第2位置换到了第8位。则逆置换就是将第40位置换到第1位,第8位置换到第2位。以此类推,逆置换规则表如下
40,08,48,16,56,24,64,32,
39,07,47,15,55,23,63,31,
38,06,46,14,54,22,62,30,
37,05,45,13,53,21,61,29,
36,04,44,12,52,20,60,28,
35,03,43,11,51,19,59,27,
34,02,42,10,50,18,58 26,
33,01,41,09,49,17,57,25,
将L16与R16构成64位数据,经过逆置换表输出密文为:
密文
0101100000001000001100000000101111001101110101100001100001101000