DES 加密的几个要点或者说是知识点:
1:DES 处理的明文需要分组,分组长度为 64 位一组。加密秘钥长度也是 64 位,但是只有 56 位被用到,其他 8 位用作奇偶校验或者完全随意设置。
2:DES 的加密和解密时用的算法相同,只不过子密钥的使用次序要反过来。
3:DES 的整个体制是公开的,系统的安全性完全靠密钥的保密。
关于加密过程的几个知识点:
DES 的加密与解密互逆。
加密过程有三个阶段构成:
1. 首先是 64 位的初始置换 (initial permutation)IP,置换根据初始置换表来进行,置换表是 DES 给定的。置换表特征为:8 行 8 列,最右一列从上到下为 24681357,右 2 列为每个数 +8,右 3 列为右 2 列 + 8 以此类推。逆初始置换表依旧为 8 行 8 列,其中左 2 列从上到下为 87654321,间隔一列 +8,依次类推。
64 位明文(2 进制)在经过 IP 初始置换后被分成左右两个部分,每部分 32 位。
大体步骤如下文:
1. 分成 32 位后要进行 16 次 Feistel 循环,这 16 轮(最开始是 8 轮但是后来发现 8 轮比较脆弱后加强为 16 轮)迭代被称为乘积变换,其中涉及轮函数 F,这个函数本身既包含换位又包含代替,将数据和密钥结合起来,出去最后一轮外,每一轮变换后得到的左右两部分进行交换,最后一轮不交换,直接进行逆初始置换得到 64 位的密文。
2.DES 算法子密钥输入长度为 64 位,但是只有 48 位是有效的,所以需要对密钥 K 进行变换得到每一轮所需的子密钥。16 轮迭代就需要 16 个 48 位的子密钥来进行加密。
3. 下面看一下 16 个密钥的生成:
64 位的密钥去掉 8 位的效验位(即第 8,16,24,32,40,48,56,64 共 8 位)剩余 56 位按照置换表 1 进行分组置换得到 C0 与 D0 两组每组 28 位密钥。如下图:
得到的 C0 与 D0 分别按照循环左移位数表进行循环左移。
循环左移表:
循环左移之后按照置压缩型 P 盒将得到的 56 位输入压缩成 48 位输出就得到了一轮的密钥 K,其中左移轮序 16 轮也是对应的 16 轮加密。
P 盒压缩如下图:
4. 在得到密钥 K 之后要与右部的 R32 位(扩展后)进行异或运算。
5. 下面 R(32 位)就需要用扩展性 P 盒(上图中的扩展变换 E)来进行 32 位到 48 位的变换。扩展到 48 位后才可以与秘钥进行异或运算。具体扩展过程如图所示:
扩展置换表:
6. 在与 48 位秘钥异或运算后得到 48 位的输出,在进行 S 盒压缩处理,S 盒一共有 8 个,每个 S 盒里面的数都是定义好的。48 位输出数据按照 8 个 S 盒分成 6 组,每一个 S 盒是 6 进 4 出,8 个 S 盒就得到 32 位。如下图:
S 盒置换表如下图:
S 盒运算举例:
得到行数盒列数,就到相应的 S 盒中找到对应的数。如下图:
7. 这样就完成了 6 位到 4 位的 S 盒压缩。
S 盒的设计机密一直以来没有公开,DES 中的 S 盒有一下这几个属性:1.S 盒的每一行都是 0~15 的一个排列;2.S 盒是非线性的,输出不是输入的一个仿射变换;3. 改变 S 盒的 1 位输入,至少有 2 位输出会发生改变。
8. 在得到 S 盒的 32 位输出后,直接进行一轮 P 盒置换(非压缩)就得到最后的 32 位输出。
P 盒置换表:
9. 最后用 L32 位盒 R32 位进行逆初始置换 IP(第一张图右半部分),就得到了最终输出的密文。
如总图最后一步:
DES 算法的安全强度: