zoukankan      html  css  js  c++  java
  • 密码学: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实现




    纵使疾风起,人生不言弃!
  • 相关阅读:
    九大经典算法之插入排序、希尔排序
    1072 开学寄语 (20 分)
    1070 结绳 (25 分
    查找字符串中的所有数字
    通过类继承计算梯形面积
    将命令的输出生成一个Web页面
    从Internet下载一个文件
    使用Excel管理命令输出
    将一个命令的输出保存到CSV文件
    使用属性存储用户编号和姓名
  • 原文地址:https://www.cnblogs.com/geekHao/p/14609699.html
Copyright © 2011-2022 走看看