DES加密算法

  1. 简介
  2. DES算法的加密流程:
    1. IP置换
    2. LR分组
    3. F轮函数:
      1. E扩展置换
      2. S盒压缩处理
      3. p盒置换
  3. 加密总结
  4. 密钥生成

简介

DES属于对称密码算法中的分组加密算法,密钥长64位,56位参与运算,其余8位为校验位(8,16,24,32,40,48,56,64)

这样做的缺点就是如果处理大量数据就会花费相当长的时间,所以DES算法也就不适合对大数据进行处理。*

当n个64位明文数据块都经过DES加密处理后,所得到的n个64位密文数据块串在一起就是密文

DES算法的加密流程:

  1. 将输入的明文进行IP初始置换。
  2. 将初始置换后的结果按照每组32位数据分成L、R两组。
  3. 将48位子密钥k[i]和32位R[i]组数据输入F函数进行处理,输出32位处理结果。
  4. 将32位F函数处理结果与32位的L[i]组数据按位进行异或操作。
  5. 将32位的异或处理结果赋值给R[i+1]分组,将32位的R[i]分组数据赋值给L[i+1]。
    L[i+1] = R[i],
    R[i+1] = L[i]^(F(k[i], R[i]))
  6. 对3、4、5步处理进行16次循环,得到L[16],R[16]。
  7. 将L[16]、R[16]数据进行交叉合并得到64位数据。
  8. 对得到的64位数据进行逆初始值置换,得到想要的密文Y。

IP置换

在密码学中置换是指在保持数据不变的情况下,打乱数据的位置顺序的操作称作置换,在DES算法中每个置换处理都会按照 相应的置换表进行操作,置换处理在DES算法中得到了充分的运用,通过置换处理可以打乱输入数据的顺序,使输入的数据变得面目全非,当然也会造成雪崩效应,因为只要有一个数据位发生变化,就会影响到很多地方。

初始置换表:

比如说 表中第一位是58 ,那就表明将置换前的58位中的数 给了第一位

代码演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const unsigned char IP_Table[64] =
{
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7
};

int IP_Substitution(const unsigned char* BitPlain, unsigned char* Bit_IP_Table)
{
int ret = 0;

for (int i = 0; i < 64; i++)
{
Bit_IP_Table[i] = BitPlain[IP_Table[i] - 1];
}

return ret;
}

LR分组

 从表面上看,这里就是将上面置换后的结果进行分组,每组32位数据。实际上这里是有一个坑的,因为从字面意思上理解他是要将8*8矩阵的数据分成左右两组,也就是左边4列为L组,右边数据为R组。但是实际上网上的DES加密工具所进行的分组不是这样子的,如果按照左右分组,最终得到的结果也就和网上加密工具的结果不一致,同样也就无法解密数据。所以我们这里就使用前后分组来进行处理,将前32为数据分给L组,后32位数据分给R组,保持最后的结果一致。

F轮函数:

  在DES算法中F函数蕴含了DES算法的主要操作,也是该算法中最重要的地方。从DES算法的Feistel框架图中,我们可以清楚的看到F函数有两个输入,一个是右分组的32位数据,另一个是子密钥的48位数据,这两个长度不同的数据是怎样进行处理的呢?这里我们就先来看看它的处理流程图吧:

F函数处理流程:

  1. 将输入的32位R组数据进行扩展置换,生成48位的数据。
  2. 将置换后的48位结果与输入的48位子密钥进行异或运算,得到48位的运算结果。
  3. 将48位运算结果分成8组,每组6Bit数据,按照组号对应相应的S盒,进行8个S盒置换,生成8个4Bit的数据。
  4. 将这8个4Bit数据合并,得到一个32位数据。
  5. 将32位进行置换P就得到最后的32位处理结果

E扩展置换

将32位的输入扩展为48位输出

我们将原始的32位数据,分成了8个4bit的,每个4bit的在第一位和最后一位都增加了一位,增加了第一位是原始数据的前一个数据的最后一位,增加的最后一位是原始数据的后一个4bit的第一个数据,

S盒压缩处理

经过扩展的48位明文和48位密钥进行异或运算后,再使用8个S盒压缩处理得到32位数据

将48位输入等分为9块,每块6位输入压缩位4位输出

这个13就是第三行第15列

p盒置换

S盒所得结果再经过P盒置换,至此,一次轮函数操作完毕

这个结果要和L0就行异或 在赋值给r1,然后运算最后就得到了R16和L16 把这俩数拼接在一起

然后经过一个逆置换,逆置换和初始置换一样

加密总结

密钥生成

密钥是64位,出去8位校验位,剩余56位参与运算,按照交换规则,生成16个48位的轮密钥 ,让你和需要经过下面这个表置换

经过这个表之后就去掉了8个校验位剩余58位比特了

c1 d1是由C0 d0左移一位得到的 ,C2 D2 是由C1 D1左移一位得到的 C3 D3 是由C2 D2 左移两位得到的

结果拼接在一起 再通过下面这个表

我们举个例子

密钥生成总结


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1204342476@qq.com

💰

×

Help us with donation