DES算法

DES算法简介

  • DES是一种明文分组为64比特,有效密钥56比特,输出密文64比特的,具有16轮迭代的Feistel密码算法。
  • DES由初始置换,16轮迭代,初始逆置换组成。

算法加密流程描述

image.png
image.png

  1. 输入64位明文,进行初始置换IP
  2. 将明文分成左右两部分,为L0,R0,各32位
  3. 在密钥的控制下,进行16次运算
  4. 运算结束将左右交换,连接在一起再进行逆置换
  5. 最后输出64位密文

算法流程

初始置换

image.png

  • 将输入的明文按照上表进行置换
  • 例如,输出块的第1位对应输入块的第58位,第2位对应第50位,依次类推
  • 则输入块是D1~D64,输出块是D58,D50,D42,……,D15,D7;
  • 然后将输出块左右分成L0和R0

加密16轮迭代

密钥置换

  • 密钥共有64位,16轮迭代后为48为子密钥
  1. 将密钥的奇偶位忽略不计(就是每个字节的第八位),64位变为56位,根本选择置换PC-1将56位的密钥分成左C0(28位),右D0(28位),表中第8、16、24、…、64位被忽略
    image.png
  2. 根据轮数,将Cn,Dn进行左移
    image.png
  • 比如C0和D0进行第一次左移,根据表格,是左移一位,得到以下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    C1
    49,41,33,25,17,9,1,
    58,50,42,34,26,18,10,
    2,59,51,43,35,27,19,
    11,3,60,52,44,36,57
    D1
    55,47,39,31,23,15,7,
    62,54,46,38,30,22,14,
    6,61,53,45,37,29,21,
    13,5,28,20,12,4,63
  1. 然后C1和D1合并,经过置换选择表2(PC-2),生成48位的子密钥,表格如下
    image.png
  2. 此后每次都进行拆分,然后左移,再合并,然后经过PC-2生成子密钥K
  3. 依次类推,得到K1~K16

扩展置换E

image.png

  • 根据以上表格,将32位扩展为48位
  • 中间为原本的32位,两边位扩展的位,总共48位

S-盒代替

image.png

  1. Rn经过扩展,为48位,与48位的Kn进行异或运算,得到48位输出块,为8个6bit的串,分别为B1~B8
  2. 根据上表,对应S1~S8,进行代替操作,这一步是将6bit的串,前后各一位对应纵列,中间四位对应行,例如110010以S1为例,在行当中找到1001对应的十六进制9,在列当中找到10对应的十六进制2,对应十六进制12,则输出为1100

P-盒置换

image.png

  1. S-盒代替之后,每盒有4位,共八盒,就是32位,作为P-盒的输入块
  2. 根据上表,对Rn进行置换,得到的串与左部分Ln进行异或运算,得到的串赋值给R(n+1)
  3. R(n)直接赋值给L(n+1)
  4. 然后再进行下一次迭代

逆置换

image.png

  • 以上的迭代算法成为函数f
  • 进行完16次迭代,得到L16和R16,然后将LR调换,最后合并为64位的输出块,进行逆置换
  • 逆置换根据上表,对应的位进行置换,逆置换是初始置换的逆运算,就是说初始置换输出的第1位是原始输入的第58位,第2位是第50位,而逆置换输出的第58位是输入的第1位,输出的第50位是输入的第2位
  • 最后得到的64位输出块,则是DES加密的最终密文