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

DES简介

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

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

算法原理与流程

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

流程大概这样是

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQCUz0or-1639576383812)(/Users/chelsea/Library/Application Support/typora-user-images/image-20211215204732899.png)]

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

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

置换表

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

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

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

img

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

Feistel加密结构

介绍:

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

img

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

轮函数:
L i = R i − 1 L_i=R_{i-1} Li=Ri1

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

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

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

  • 首先对于输入的64bit的明文,先通过一个IP置换表,进行一次置换
  • 然后将产生的64bit的东西从中间劈开,分成 L 0 , R 0 L_0,R_0 L0,R0,作为初始的值进行第一次的轮函数, L 1 = R 0 L_1=R_0 L1=R0, R 1 = L 0 ⨁ F ( R 0 , K 1 ) R_1=L_0\bigoplus F(R_0,K1) R1=L0F(R0,K1),这个函数和密钥的产生我们一会再讲
  • 如此下去进行16轮,最后得到 L 16 , R 16 L_{16},R_{16} L16R16
  • 交换一下 L 16 , R 16 L_{16},R_{16} L16R16,得到64bit R 16 L 16 R_{16}L_{16} R16L16
  • 再进行一次逆IP置换,得到64bit的密文

密钥生成

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

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

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

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

64bit的初始密钥,经过置换盒子——PC-1盒,去掉奇偶校验位,得到56bit,分成左右两部分 C 0 , D 0 C_0,D_0 C0,D0,各28bit,经过密钥位移表,得到 C 1 , D 1 C_1,D_1 C1,D1,一方面合成56bit的一个串经过置换盒子——PC-2盒压缩得到48bit K 1 K_1 K1,另一方面作为 C i − 1 , D i − 1 C_{i-1},D_{i-1} Ci1,Di1去产生下一个C和D…

PC-1盒是56位的置换盒,PC-2盒是一个48位的置换盒,密钥移位表是一个2行16列的表,表示第 i C i − 1 , D i − 1 C_{i-1},D_{i-1} Ci1,Di1的左移的次数,如下:

img

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

F(R,K)函数

首先是对于32bit R i − 1 R_{i-1} Ri1进入一个E盒,进行位数的扩展,扩展成48bit再与 K i K_{i} Ki进行异或后进入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} Si+1Si+2Si+3Si+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} S1S2S3S4>S32S1S2S3S4S5

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

在这里插入图片描述

S盒

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

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

img

最后

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值