E43792a727178a85663da28d2f2e00fd
DES对称加密算法

1 前言

  DES算法是一种常见的分组加密算法,由IBM公司在1971年提出。DES算法是分组加密算法的典型代表,同时也是应用最为广泛的对称加密算法。本文将详细讲述DES的原理以及实现过程。

1.1 明文

  明文是指没有经过加密的数据。一般而言,明文都是等待传输的数据。由于没有经过加密,明文很容易被识别与破解,因此在传输明文之前必须进行加密处理。

1.2 密文

  密文只是明文经过某种加密算法而得到的数据,通常密文的形式复杂难以识别及理解。

1.3 密钥

  密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。

1.4 对称加密

  通信双方同时掌握一个密钥,加密解密都是由一个密钥完成的(即加密密钥等于解密密钥,加解密密钥可以相互推倒出来)。双方通信前共同拟定一个密钥,不对第三方公开。

1.5 分组密码

  分组密码是将明文分成固定长度的组,每一组都采用同一密钥和算法进行加密,输出也是固定长度的密文。

2 DES加密算法

2.1 分组长度

  DES加密算法中,明文和密文为64位分组。密钥的长度为64位,但是密钥的每个第八位设置为奇偶校验位,因此密钥的实际长度为56位。

2.2 加密流程

DES加密算法大致分为4个步骤:
(1)初始置换
(2)生成子密钥
(3)迭代过程
(4)逆置换

整个过程流程图:

3 初始置换

初始置换是将原始明文经过IP置换表处理。置换过程如图:

例如:
输入64位明文数据M(64位):
明文M(64位)=
0110001101101111011011010111000001110101011101000110010101110010
选取密钥K(64位):
密钥K(64位)=
0001001100110100010101110111100110011011101111001101111111110001

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,

IP置换表中的数据指的是位置,例如58指将M第58位放置第1位。

M经过IP置换后为M'

M'(64位) =
1111111110111000011101100101011100000000111111110000011010000011
取M'的前32位作为L0,则有
L0(32位)= 11111111101110000111011001010111
取M'的后32位作为R0,则有
R0(32位)= 00000000111111110000011010000011

4 生成子密钥

DES加密共执行16次迭代,每次迭代过程的数据长度为48位,因此需要16个48位的子密钥来进行加密,生成子密钥的过程如下:

以第3节的例子说明子密钥的计算过程:

(1)第一轮置换:

密钥K=0001001100110100010101110111100110011011101111001101111111110001需经过PC-1表置换,即执行置换选择1过程。
PC-1表为:

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

PC-1表为8行7列的表,密钥K经PC-1后变为56位数据K'。

K'(56位)= 11110000110011001010101011110101010101100110011110001111
取K'的前28位作为C0,则有
C0(28位)= 1111000011001100101010101111
取K'的后28位作为D0,则有
D0(28位)= 0101010101100110011110001111
获得C0,D0后进行左移操作需要查询移动位数表:

每轮移动移动位数表如下:

轮数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
位数 1 1 2 2 2 2 2 2 1  2   2   2   2  2   2   1

进行第一轮移位,轮数为1,查表得左移位数为1。

C0左移1位为C1
C1(28位) = 1110000110011001010101011111
D0左移1位为D1
D1(28位) = 1010101011001100111100011110
将C1和D1合并后,经过PC-2表置换得到子密钥K1,PC-2表中去除了第9,18,22,25,35,38,43,54位。

PPC-2表为6X8的表,PC-2表如下:

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

由于PC-2表为6X8的表,经PC-2置换后的数据为48位,置换后得到密钥K1
K1(48位)= 000110110000001011101111111111000111000001110010

(2)第二轮置换

C1和D1再次左移,轮数 = 2,查表得左移位数 = 1,则C1和D1左移1位得到C2和D2

C2(28位)= 1100001100110010101010111111
D2(28位)= 0101010110011001111000111101
C2和D2合并后为56位,经过PC-2表置换得到密钥K2(48位)
K2(48位)= 011110011010111011011001110110111100100111100101
依次类推,得到K3-K16子密钥,注意Ci和Di左移的位数。

C3(28位) = 0000110011001010101011111111
D3(28位) = 0101011001100111100011110101
K3(48位) = 010101011111110010001010010000101100111110011001

C4(28位) = 0011001100101010101111111100
D4(28位) = 0101100110011110001111010101
K4(48位) = 011100101010110111010110110110110011010100011101

C5(28位) = 1100110010101010111111110000
D5(28位) = 0110011001111000111101010101
K5(48位) = 011111001110110000000111111010110101001110101000

C6(28位) = 0011001010101011111111000011
D6(28位) = 1001100111100011110101010101
K6(48位) = 011000111010010100111110010100000111101100101111

C7(28位) = 1100101010101111111100001100
D7(28位) = 0110011110001111010101010110
K7(48位) = 111011001000010010110111111101100001100010111100

C8(28位) = 0010101010111111110000110011
D8(28位) = 1001111000111101010101011001
K8(48位) = 111101111000101000111010110000010011101111111011

C9(28位) = 0101010101111111100001100110
D9(28位) = 0011110001111010101010110011
K9(48位) = 111000001101101111101011111011011110011110000001

C10(28位) = 0101010111111110000110011001
D10(28位) = 1111000111101010101011001100
K10(48位) = 101100011111001101000111101110100100011001001111

C11(28位) = 0101011111111000011001100101
D11(28位) = 1100011110101010101100110011
K11(48位) = 001000010101111111010011110111101101001110000110

C12(28位) = 0101111111100001100110010101
D12(28位) = 0001111010101010110011001111
K12(48位) = 011101010111000111110101100101000110011111101001

top Created with Sketch.