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