目录

DES加密算法密码学网络空间安全

DES加密算法|密码学|网络空间安全

DES简介

数据加密标准 (Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,它基于使用56位密钥的对称算法。

然而DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。

算法原理与流程

DES是一种分组加密算法,每次都处理固定的64位大小的明文,返回64位的密文,对于长度为n的,可以分成若干个64位的,剩余的小于64位的可以按照某种具体的规则来填充位。

流程大概这样是

https://i-blog.csdnimg.cn/blog_migrate/98b7b3c78162bfdccc6498cace3b102b.png

这个过程中有三个重要的框架:

  • 左边的Feistel加密结构
  • 右上角的密钥生成过程
  • 右下角的F(X, Y)的工作过程

置换表

这个过程中用到了许多的置换表,主要作用有两个:(不是所有的置换表都有这两个作用)

  • 消位。比如密钥生成过程的第一步:K通过PC-1盒置换来去掉奇偶校验位,使得从64位变成56位;还有类似的PC-2盒;以及轮函数中的S盒可以理解为一个特殊的置换表
  • 混淆。扩散和混淆是Shannon提出的设计密码系统的两个基本方法,混淆的目的是使的明文和密文之间的关系尽可能复杂

根据下面的表我们来理解一下置换表的工作方法

https://i-blog.csdnimg.cn/blog_migrate/987ced04ef0f2d0a079b3f283d2e8ce0.png

现在有一个64位的串s,那从表a[65]的第一个a[1]开始, a[1]=57 表示将 s[57] 放到 t 串的第一位, a[2] = 49 表示将 s[49] 放到 t 串的第2位…知道放完最后一个,就会得到一个 t 串,这个 t 串就是 s 串经过置换表后的结果

Feistel加密结构

介绍:

很多分组密码的结构本质上来说是基于Feistel网络的结构,通过交换、异或等操作得到密文,大体结构如下所示:

https://i-blog.csdnimg.cn/blog_migrate/1652c20a79f8f2e145039a41b970d02b.png

就是进行16轮的代换-置换

轮函数:

L i

R i − 1 L_i=R_{i-1}

L

i

=

R

i

1

R i

L i − 1 ⨁ F ( R i − 1 , K i ) R_i=L_{i-1}\bigoplus F(R_{i-1},K_i)

R

i

=

L

i

1

F

(

R

i

1

,

K

i

)

这是Feistel最基本的函数,下一个的L是上一个的R,下一个的R是上一个的L⨁F(上一个的R, K)

这里我们分析一下DES的Feistel框架:

  • 首先对于输入的 64bit 的明文,先通过一个IP置换表,进行一次置换

  • 然后将产生的 64bit 的东西从中间劈开,分成

    L 0 , R 0 L_0,R_0

    L

    0

    ,

    R

    0

    ,作为初始的值进行第一次的轮函数,

    L 1

    R 0 L_1=R_0

    L

    1

    =

    R

    0

    ,

    R 1

    L 0 ⨁ F ( R 0 , K 1 ) R_1=L_0\bigoplus F(R_0,K1)

    R

    1

    =

    L

    0

    F

    (

    R

    0

    ,

    K

    1

    ) ,这个函数和密钥的产生我们一会再讲

  • 如此下去进行16轮,最后得到

    L 16 , R 16 L_{16},R_{16}

    L

    1

    6

    R

    1

    6

  • 交换一下

    L 16 , R 16 L_{16},R_{16}

    L

    1

    6

    R

    1

    6

    ,得到 64bit

    R 16 L 16 R_{16}L_{16}

    R

    1

    6

    L

    1

    6

  • 再进行一次逆IP置换,得到 64bit 的密文

密钥生成

DES只需要一个初始的 56bit 的密钥,那怎么产生16个轮函数所需的

K i K_i

K

i

首先,提一个小的点,DES使用一个56位的初始密钥,但提供的其实是一个64位的值,这是因为在硬件实现中每8位可以用于奇偶校验,在软件实现中多出的位只是简单的忽略掉。

所以第8位、16位、32位、40位、48位、56位、64位都是奇偶校验位,

而忽略掉他们的方法就是我上次讲的置换函数的第一个作用:去位

64bit 的初始密钥,经过置换盒子——PC-1盒,去掉奇偶校验位,得到 56bit ,分成左右两部分

C 0 , D 0 C_0,D_0

C

0

,

D

0

,各 28bit ,经过密钥位移表,得到

C 1 , D 1 C_1,D_1

C

1

,

D

1

,一方面合成 56bit 的一个串经过置换盒子——PC-2盒压缩得到 48bit

K 1 K_1

K

1

,另一方面作为

C i − 1 , D i − 1 C_{i-1},D_{i-1}

C

i

1

,

D

i

1

去产生下一个C和D…

PC-1盒是56位的置换盒,PC-2盒是一个48位的置换盒,密钥移位表是一个2行16列的表,表示第 i

C i − 1 , D i − 1 C_{i-1},D_{i-1}

C

i

1

,

D

i

1

的左移的次数,如下:

https://i-blog.csdnimg.cn/blog_migrate/db0b8eaf324fece365c41500cab1bfc2.png

假如一个串是100010101,左移2位就是:001010110

F(R,K)函数

首先是对于 32bit

R i − 1 R_{i-1}

R

i

1

进入一个E盒,进行位数的扩展,扩展成 48bit 再与

K i K_{i}

K

i

进行异或后进入S盒进行压缩,得到 32bit 的串,再进入P盒进行置换

E盒

该置换盒的主要目的是在加密数据的过程中制造一些 雪崩效应 ,使用数据块中的1位将在下一步操作中影响更多位,从而产生 扩散效果

这是一个扩展盒,扩展的方法是:将32位的数分成8个4位的,对于第 i 个的组成是

S i + 1 S i + 2 S i + 3 S i + 4 S_{i+1}S_{i+2}S_{i+3}S_{i+4}

S

i

1

S

i

2

S

i

3

S

i

4

,根据E盒找到前一个对应的数和后一个对应的数插进去就行

比如

S 1 S 2 S 3 S 4 −

S 32 S 1 S 2 S 3 S 4 S 5 S_{1}S_{2}S_{3}S_{4}->S_{32}S_{1}S_{2}S_{3}S_{4}S_{5}

S

1

S

2

S

3

S

4

S

3

2

S

1

S

2

S

3

S

4

S

5

其实就是把原来的前一个拿过来,后一个拿过来

https://i-blog.csdnimg.cn/blog_migrate/fecb91736fa9cb869f2cab0edc7aee95.png

S盒

进行压缩的盒子,可以将 48bit 压缩成 32bit

方法是:将 48bit 分成8份,每份6个数,用第一个和最后一个组成二进制转换成十进制对应行 i ,中间的四个数构成的二进制转换成十进制,作为列 j ,查表得到一个十进制,再转换成二进制即可

https://i-blog.csdnimg.cn/blog_migrate/6d05287bfb56445a9abde7f91a0fc392.png

最后

根据框架图硬算就行了,这里就不放代码了

最后就是能得到64位的密文