首页 > 代码库 > DES原理与实现

DES原理与实现

DES是对称密码的一种,它使用56位秘钥对64位长分组进行加密。

DES对每个分组的内容都会进行16轮迭代,每轮的操作相同但是对应不同的子秘钥。所有的子秘钥都是由主密钥推导而来。

 

64位明文加密过程如下:

1. 按位置换(IP)

2. 明文被分成L0和R0两部分。

3. L1=R0  R1=L0⊕f(R0,k1)

4. 重复步骤3 16次

5. 按位置换(IP^-1)

 

其中的重点在于:

1. 如何实现函数f

2. 如何生成子秘钥k

问题简单的解答如下:

1. 函数f 输入与输出的数据为32位。

E:

  将输入的数据分成8个4位的分组。这个过程在E盒中进行。E盒是一种特殊的置换。

  32位输入中有16位输入位在输出中出现了两次。分别为第1 4 5 8 9 12 ... 32位

  E盒的输入数据为32位,输出为48位,仅有置换操作。

S:

  将拓展得到的48位结果与密钥ki进行XOR操作,将8个6位长的分组送入8个不同的替换盒S中,将6位输出裁剪成4位。

  S盒的输入数据为48位,输出为32位,有和密钥的XOR操作,也有置换。

P:   

  按位置换,以实现扩散。

  P盒的输入和输出均为32位,仅有置换操作。

2. 密钥生成函数GetKey的输入为64位密钥,输出为16个48位子密钥。

密钥的实际有效位数为56位,其余8位为奇校验位。PC-1处理得到的56位密钥分为C和D两部分。首先将C和D按照轮数移动一位或者两位。然后将C和D合起来,用PC-2将56位密钥置换成48位密钥。

PC-1:

  置换的意义是去掉校验位。

PC-2:

  意义是将56位置换成48位。

 

鉴于我还没开始写代码,先写一下我认为可能会出现的问题:

1. 最基本的,怎么实现置换

2. 密钥的格式是什么:字母或者是数字?多少位?

3. 函数过程中数据应该是以二进制流动的,二进制如何与字母数字转化?(啊这个问题好像不难)

 

DES原理与实现