想过成功,也想过失败。但从未想过放弃……

DES 算法详述

上一篇 / 下一篇  2009-11-01 21:23:41 / 个人分类:编程语言

DES算法总的说来可以两部分组成:

一、对密钥的处理。这一部分是把我们用的64位密钥(实际用的56位,去掉了8个奇偶校验位)分散成16个48位的子密钥。

二、对数据的加密。通过第一步生成的子密钥来加密我们所要加密的数据,最终生成密文。

下面就通过这两部分分别介绍DES算法的实现原理。

 

一.密钥分散——子密钥的生成

64比特的密钥生成16个48比特的子密钥。其生成过程见图:

64比特的密钥K,经过PC-1后,生成56比特的串。其下标如表所示:

该比特串分为长度相等的比特串C0和D0(分别为28比特)。然后C0和D0分别循环左移1位,得到C1和D1。C1和D1合并起来生成C1D1。C1D1经过PC-2变换后即生成48比特的K1。K1的下标列表为:

C1、D1分别循环左移LS2位,再合并,经过PC-2,生成子密钥K2……依次类推直至生成子密钥K16。

注意:Lsi (I =1,2,….16)的数值是不同的。具体见下表:

 

注:PC-1 和 PC-2是密钥的指定为置换。

 

至此,我们已成功的生成了16个48位的子密钥。

 

二.加密流程图

DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2…m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图示如下:

 

二.      DES算法加密过程

对DES算法加密过程图示的说明如下:待加密的64比特明文串m,经过IP置换后,得到的比特串的下标列表如下:

该比特串被分为32位的L0和32位的R0两部分。R0子密钥K1经过变换f(R0,K1)(f变换算法见下)输出32位的比特串f1,f1与L0做异或运算。

f1与L0做异或运算后的结果赋给R1,R0则原封不动的赋给L1。L1与R0又做与以上完全相同的运算,生成L2,R2…… 一共经过16次运算。最后生成R16和L16。其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。

R16与L16合并成64位的比特串。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1后所得比特串的下标列表如下:

经过置换IP-1后生成的比特串就是密文e.。

 

f 算法

变换f(Ri-1,Ki)的功能是将32比特的输入再转化为32比特的输出。其过程如图所示:

 

 

首先、输入Ri-1(32比特)经过变换E后,膨胀为48比特。膨胀后的比特串的下标列表如下:

 

其次、膨胀后的E和Ki异或的结果分为8组,每组6比特。各组经过各自的S盒后,变为4比特,

S盒的算法为:输入b1,b2,b3,b4,b5,b6,计算x=b1*2+b6, y=b5+b4*2+b3*4+b2*8,再从Si表(见下表)中查出x 行,y 列的值Sxy。将Sxy化为二进制,即得Si盒的输出。

 

最后、合并8组S盒输出成为32比特。该32比特经过P变换后,其下标列表如下:

 

 

经过P变换后输出的比特串才是32比特的f (Ri-1,Ki)。

 

以上介绍了DES算法的加密过程。DES算法的解密过程是一样的,区别仅仅在于第一次迭代时用子密钥K16,第二次K15、......,最后一次用K1,算法本身并没有任何变化。


2

2

3

3

4

4

5

5

6

6

7

7

8

8

9

9

11

11

TAG:

 

评分:0

我来说两句

日历

« 2024-05-09  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 28905
  • 日志数: 40
  • 建立时间: 2008-11-24
  • 更新时间: 2010-05-20

RSS订阅

Open Toolbar