算法结构
- Feistel结构
- 16轮迭代
- 将Ri-1用函数f运算一下
- f(Ri-1)和Li-1异或一下
- 将上一步的结果作为下一轮的右侧,即Ri
- 将Ri-1变成下一轮的左侧(即Li)
- SP结构
DES算法流程:
- 生成16个48位的子密钥
- 总结:64bit->56bit->48bit
- 置换选择1
- 给定:一张行7列8的置位表+16个十六进制数的初始密钥
- 以下类似于初始置换IP的过程
- 将密钥化成二进制
- 根据置位表,将数字填入其中
- 得到28bit的C0和D0
- 切开,得到C0(28bit)和D0(28bit)
- 将C0和D0分别循环左移和右移
- 会有一张循环左移位数表:第一列为迭代次数,第二列为循环左移的位数
- 因为需要迭代16轮,所以每一轮会给出迭代次数
- 循环左移的意思就是把脑袋给到腚
- 得到28bit的C1和D1
- 置位选择2
- 非常类似于置位选择1
- 把28bit的C1和D1放到一起变成56位
- 然后根据置位表,再去掉八位
- 最终生成48bit的一个密钥
- 循环左右移2
- 输入:C1&D1+循环移位表中的迭代次数2的值
- .........(循环16次得到16个48bit的密钥)
- 初始置换IP
- 和生成密钥同时进行
- 给定:一张8*8的置位表+16个十六进制数的明文
- 将明文全部转换成二进制数,16*4共64位
- 将转换好的明文依据置位表中的顺序重排
- 将填好的表一份为二
- 上半部分为L0,下半部分为R0
- 16轮feistel结构迭代
- F轮函数结构框架:将明文进行完初始置换IP后,进入轮函数F
- 输入:32位的A
- 扩展置换E
- 经过选择运算E得到48位的中间结果
- 将48位的中间结果和48位的子密钥Ki进行异或运算
- S盒代换
- 置换运算P
- 输出:32位的F(Ai)
- 扩展置换E
- 在DES算法的第二步――初始置换IP后是不是得到了两个32位的L0和R0?
- 根据行4列8的扩展置换E将R0(或L0)变成48位的E(R0)
- 在DES算法的第一步――生成密钥的过程中是不是得到了16个密钥?密钥是多少位的?
- 将E(R0)与密钥进行异或
- 至此,原来32位的R0变成了48位,故称为扩展置换E
- 输出:48位――E(R0)^K1
- S盒代换
- 输入:48位
- S盒代换给定了一张S盒矩阵(行4列16)
- 48 = 6*8比如011001 011100 ....
- 将8个数字的首尾作为行,中间4个数作为列,输入矩阵
- 比如011001 -> (01,1100) -> (1,12)
- 那就看矩阵中(1,12)的数字是什么?比如是9,那么输出就是1001
- 那最终我们得到了8个4位的数字
- 输出:32位――S(E(R0)^K1)
- 置换P
- 输入:32位
- 给定一张置换表行4列8
- 置换
- 输出:32位 P(S(E(R0)^K1)),至此,f(Ro,k1)已经全部完成
- 逆初始置换IP-1
- 16轮迭代全部完成之后,得到了64bit的矩阵
- 需要
- F轮函数结构框架:将明文进行完初始置换IP后,进入轮函数F