密码学: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位加密密钥。定义运算规则:

    [egin{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实现




纵使疾风起,人生不言弃!
原文地址:https://www.cnblogs.com/geekHao/p/14609699.html