密码学:DES加密算法

密码学——DES加密算法

DES 算法是一种常见的分组加密算法,由IBM公司在1971年提出。DES 算法是分组加密算法的典型代表,同时也是应用最为广泛的对称加密算法。本文将详细讲述DES 的原理以及实现过程。

概念

对称加密

通信双方同时掌握一个密钥,加密解密都是由一个密钥完成的(即加密密钥等于解密密钥,加解密密钥可以相互推倒出来)。双方通信前共同拟定一个密钥,不对第三方公开。

分组密码

如果经过加密所得到的密文仅与给定的密码算法和密钥有关,与被处理的明文数据在整个明文中的位置无关,则称为分组密码体制。通常以大于等于64位的数据块为单位,加密得相同长度的密文。DES 加密算法中,明文和密文为 64 位分组。密钥的长度为 64 位,但是密钥的每个第八位设置为奇偶校验位,因此密钥的实际长度为56位。

DES加密流程

DES 加密算法大致分为 4 个步骤:
(1)初始置换
(2)生成子密钥
(3)迭代过程
(4)逆置换

下面详细介绍每一部分的算法,文中提到的各种置换规则表(IP, PC_1, PC_2, ...)都是经DES算法规定、公开的算法参数。具体内容可参考这里。文中提到的置换操作,简单实现如下

def permutation(src, rule):
    # src:置换源向量
    # rule:置换规则向量, rule[i]的值val表示将src[val]移到输出的第i位
    res = []
    for i in rule:
        res.append(src[i-1])
    return res
  1. 初始置换

    • 首先将明文\(M[64]\)使用初始置换IP(initial permutation)表进行置换得到\(M'[64]\)
    • \(M'[64]\)按前32位,后32位分为两部分\(L_0[32],\ R_0[32]\)
  2. 生成子密钥

    在后续的迭代过程中,每一轮需要用到不同的子密钥参与计算,使用密钥\(K\)生成子密钥的过程如下:

    • 使用置换表PC_1将密钥\(K[64]\)缩减为56位的数据\(K'[56]\)
    • 进行16轮迭代生成16个子密钥,对于第\(i\)次迭代:
      • \(K'\)的前28位作为\(Ci\), 后28位作为\(Di\)
      • 查找移动位数表shift表中规定的第\(i\)轮对\(C_i\)\(D_i\)进行左移的位数\(j\)
      • \(C_i\)\(D_i\)进行循环左移\(j\)
      • 将移位后的\(C_i\)\(D_i\)合并得到\(K'_i\),使用PC_2置换表对\(K'_i\)进行置换,得到本次迭代生成的密钥\(K_i\)
  3. 迭代过程

    将初始置换得到的\(L_0\)\(R_0\)作为输入,设\(L_i[32]\)\(R_i[32]\)为第i次迭代结果的左半部分与右半部分,子密钥\(K_i\)为第\(i\)轮的48位加密密钥。定义运算规则:

    \[\begin{split} & L_i = R_{i-1} \\ &R_i = L_{i-1} \oplus f(R_{i-1}, K_i) \end{split} \]

    整个迭代过程如下:

    将上面的迭代过程执行16次。每一轮迭代的具体过程如下:

    首先,令上一轮的输出为\(L_{i-1}[32],\ R_{i-1}[32]\),则在第\(i\)次迭代中,首先令\(L_i = R_{i-1}\)。将\(R_{i-1}\)作为输入,进行如下的计算:

    1. 扩展置换E:\(R_{i-1}\)在与\(K_i\)进行异或之前,需要通过E置换表将位数扩展到48位,令异或后的结果为\(res'[48]\)

    2. S盒替换:将\(res'[48]\)通过S盒替换,将位数变换回32位。具体过程为:

      1. \(res'\)按每6位进行分组,得到8组分片\(F\)
      2. 对于每个分片\(F_i[6]\),组合第1,6位的二进制值,计算对应的十进制值row,组合第2到第5位的二进制值,计算对应的十进制值col。对于分片\(i\),使用规则表\(S_i[64]\)进行转换,查找\(S_i[row*16+col]\)的值,转换为4位的二进制值。如果位数不足,在左侧用0填充。
      3. 将每个6位的分片通过\(S_i\)转换后得到的4位输出按序合并,得到最后32位的输出res''。
    3. P盒置换:使用置换表P对\(res''\)进行置换,得到函数\(f\)的最终结果res''。

    4. 最后使用\(res''\)与上一轮的\(L_{i-1}[32]\)进行异或,得到新的\(R_i[32]\)

  4. 逆置换

    将上述16次迭代得到的\(L_{16},\ R_{16}\)合并,将得到的结果使用逆置换表R进行转换,得到最后的密文输出。

Python实现

DES加密算法的python实现




posted @ 2021-04-02 10:55  &Yhao  阅读(1174)  评论(0编辑  收藏  举报