返回顶部
首页 > 资讯 > 后端开发 > Python >DES算法的python3实现
  • 383
分享到

DES算法的python3实现

算法DES 2023-01-31 02:01:53 383人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

DES原理 这里不予以复述, 有很多优秀的博客 原理可以参考这篇博客 https://www.cnblogs.com/songwenlong/p/5944139.html 1. 主函数框架 DES 函数 传入参数为 tex

DES原理 这里不予以复述, 有很多优秀的博客
原理可以参考这篇博客
https://www.cnblogs.com/songwenlong/p/5944139.html

1. 主函数框架

DES 函数 传入参数为

  • text(明文 或者 密文)
  • key (解密的key)
  • flag (是加密还是解密过程)

# DES 算法实现 flag是标志位 当为-1时, 是DES解密, flag默认为0
def DES (text, key, flag = "0"):
    # 初始字段
    # IP置换
    IniTKEyCode = IP(text)
    # 产生子密钥 集合
    subkeylist = createSubkey(key)
    # 获得Ln 和 Rn
    Ln = InitKeyCode[0:32]
    Rn = InitKeyCode[32:]
	# 如果是解密的过程 把子密钥数字逆过来 就变成解密过程了
    if (flag == "-1") :
        subkeylist = subkeylist[::-1]


    for subkey in subkeylist:
        while len(Rn) < 32:
            Rn = "0" + Rn
        while len(Ln) < 32:
            Ln = "0" + Ln

        # 对右边进行E-扩展
        Rn_expand = E_expend(Rn)
        # 压缩后的密钥与扩展分组异或以后得到48位的数据,将这个数据送入S盒
        S_Input = int(Rn_expand, base=2) ^ int(subkey, base=2)

        # 进行S盒替代
        S_sub_str = S_sub(S_Input)

        #P盒置换  并且
        #  左、右半部分交换,接着开始另一轮
        (Ln, Rn) = P(Ln, S_sub_str, Rn)

        #进行下一轮轮置换

    # 最后一轮之后  左、右两半部分并未进行交换
    # 而是两部分合并形成一个分组做为末置换的输入。
    # 所以要重新置换 一次

    (Ln, Rn) = (Rn, Ln)
    # 末置换得到密文
    re_text = IP_inverse(Ln, Rn)

    return re_text

2. 各种置换矩阵的定义

DES有各种置换矩阵的定义, 所以提前定义好, 但是这里虽然说是矩阵 但是使用数组来表示的

# S盒 的置换矩阵
S_MATRIX = [(14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
      0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
      4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
      15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13),
     (15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
      3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
      0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
      13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9),
     (10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
      13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
      13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
      1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12),
     (7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
      13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
      10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
      3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14),
     (2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
      14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
      4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
      11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3),
     (12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
      10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
      9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
      4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13),
     (4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
      13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
      1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
      6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12),
     (13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
      1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
      7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
      2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11)]
# P置换的置换矩阵
P_MATRIX = [16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
              2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25]
# IP置换的 置换矩阵
IP_MATRIX = [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]

# 压缩置换矩阵  从56位里选48位
COMPRESS_MATRIXS = [14, 17, 11, 24, 1, 5,
              3, 28, 15, 6, 21, 10,
              23, 19, 12, 4, 26, 8,
              16, 7, 27, 20, 13, 2,
              41, 52, 31, 37, 47, 55,
              30, 40, 51, 45, 33, 48,
              44, 49, 39, 56, 34, 53,
              46, 42, 50, 36, 29, 32]
# E扩展置换矩阵

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

3.IP置换函数

对于置换 我们的明文是用一个长度为64的字符01串构成的 所以置换 只需要新的字符串 然后按照置换矩阵的下表来把原字符串的单个字符加入

def IP(Mingwen):
    #如果长度不是64 就退出
    assert len(Mingwen) == 64

    ret = ""
    #通过循环 进行IP置换
    for i in IP_MATRIX:
        ret = ret + Mingwen[i - 1]
    return ret

4. 循环左移位数函数

对输入的str 按照shift_count的大小 左移shift_count位 这个函数主要用于子密钥生成


def shift(str, shift_count):
    try:
        if len(str) > 28:
            raise NameError
    except TypeError:
        pass

    str = str[shift_count:] + str[0:shift_count]
    return str

5.生成子密钥函数

此函数用来生成子密钥 生成16组子密钥 用于和扩展分组 异或


def createSubkey(key):
    # 如果key长度不是64 就退出
    assert len(key) == 64

    #DES的密钥由64位减至56位,每个字节的第8位作为奇偶校验位
    #把56位 变成 2个28位

    Llist = [57, 49, 41, 33, 25, 17, 9,
             1, 58, 50, 42, 34, 26, 18,
             10, 2, 59, 51, 43, 35, 27,
             19, 11, 3, 60, 52, 44, 36]
    Rlist = [63, 55, 47, 39, 31, 23, 15,
             7, 62, 54, 46, 38, 30, 22,
             14, 6, 61, 53, 45, 37, 29,
             21, 13, 5, 28, 20, 12, 4]

    # 初试生成 左右两组28位密钥
    L0 = ""
    R0 = ""

    for i in Llist:
        L0 += key[i - 1]
    for i in Rlist:
        R0 += key[i - 1]

    assert len(L0) == 28
    assert len(R0) == 28

    #轮函数生成 48位密钥

    #定义轮数
    Movetimes = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]
    #定义返回的subKey
    retkey = []
    #开始轮置换
    for i in range(0, 16):
        #获取左半边 和 右半边  shift函数用来左移生成轮数
        L0 = shift(L0, Movetimes[i])
        R0 = shift(R0, Movetimes[i])
        #合并左右部分
        mergedKey = L0 + R0

        tempkey = ""
        # 压缩置换矩阵  从56位里选48位
        #选出48位子密钥
        for i in COMPRESS_MATRIXS:
            tempkey += mergedKey[i - 1]
        assert len(tempkey) == 48
        #加入生成子密钥
        retkey.append(tempkey)

    return retkey

6.E扩展置换

用于把右边的32位扩展成48位


def E_expend(Rn):

    retRn = ""
    for i in E_MATRIX:
        retRn += Rn[i - 1]
    assert len(retRn) == 48
    return retRn

7.S盒替换函数

压缩后的密钥与扩展分组异或以后得到48位的数据,将这个数据送入S盒,进行替代运算。替代由8个不同的S盒完成,每个S盒有6位输入4位输出。48位输入分为8个6位的分组,一个分组对应一个S盒,对应的S盒对各组进行代替操作。


# S盒替代运算
def S_sub(S_Input):
    #从第二位开始的子串  去掉0X
    S_Input = bin(S_Input)[2:]

    while len(S_Input) < 48:
        S_Input = "0" + S_Input

    index = 0
    retstr = ""

    for Slist in S_MATRIX:
        # 输入的高低两位做为行数row
        row = int(S_Input[index] + S_Input[index + 5], base=2)
        # 中间四位做为列数L
        col = int(S_Input[index + 1:index + 5], base=2)
        # 得到 result的 单个四位输出
        ret_single = bin(Slist[row * 16 + col])[2:]

        while len(ret_single) < 4:
            ret_single = "0" + ret_single

        # 合并单个输出
        retstr += ret_single
        # index + 6 进入下一个六位输入
        index += 6

    assert len(retstr) == 32

    return retstr

8.P置换

S盒代替运算的32位输出按照P盒进行置换

最后,P盒置换的结果与最初的64位分组左半部分L0异或,然后左、右半部分交换,接着开始另一轮。

def P(Ln, S_sub_str, oldRn):
    # P 盒置换
    tmp = ""
    for i in P_MATRIX:
        tmp += S_sub_str[i - 1]
    # P盒置换的结果与最初的64位分组左半部分L0异或
    LnNew = int(tmp, base=2) ^ int(Ln, base=2)
    LnNew = bin(LnNew)[2:]
    while len(LnNew) < 32:
        LnNew = "0" + LnNew
    assert len(LnNew) == 32
    # 左、右半部分交换,接着开始另一轮
    (Ln, Rn) = (oldRn, LnNew)

    return (Ln, Rn)

9. IP逆置换

末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入
置换后得到密文或者解密的明文

def IP_inverse(L16, R16):
    tmp = L16 + R16
    retstr = ""
    for i in IP_INVERSE_MATRIX:
        retstr += tmp[i - 1]
    assert len(retstr) == 64
    return retstr

10. TEST函数

用来测试效果

if __name__ == "__main__":
    key =     "0101101000110101010101110111100110010011001100110100111101100111"
    Mingwen = "1001101010110101011001110011001001010001010101110011010110110011"

    #打印明文的16进制形式
    print("明文的16进制形式:         " + hex(int(Mingwen, base=2)).upper())

    ciphertext = DES(Mingwen, key)

    #打印加密后的密文
    print("加密后的密文:             " + hex(int(ciphertext, base=2)).upper())

    falseKey = "0001101000110101010101110111100110010011001100110100111101100111"

    decode_ciphertext = DES(ciphertext, key, "-1")
    #打印解密后的明文  看是否相同
    print("解密后的明文:             " + hex(int(decode_ciphertext, base=2)).upper())

    decode_ciphertext = DES(ciphertext, falseKey, "-1")
    # 打印给定错误的key 解密后的明文  看是否不同
    print("给定错误的key 解密后的明文:" + hex(int(decode_ciphertext, base=2)).upper())

实现结果

在这里插入图片描述

--结束END--

本文标题: DES算法的python3实现

本文链接: https://lsjlt.com/news/185695.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • DES算法的python3实现
    DES原理 这里不予以复述, 有很多优秀的博客 原理可以参考这篇博客 https://www.cnblogs.com/songwenlong/p/5944139.html 1. 主函数框架 DES 函数 传入参数为 tex...
    99+
    2023-01-31
    算法 DES
  • C#加解密之DES算法的实现
    目录前言实现功能开发环境实现代码实现效果前言 说完了对称加密中的AES,这一篇再来介绍下DES。 加解密原理什么的就不介绍了,大家可以自行百度(主要我也不太明白,也不需要太明白),大...
    99+
    2024-04-02
  • java实现的DES加密算法详解
    本文实例讲述了java实现的DES加密算法。分享给大家供大家参考,具体如下:一、DES加密算法介绍要求密钥必须是8个字节,即64bit长度因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用加密、...
    99+
    2023-05-31
    java des 加密算法
  • 详解DES加密算法的原理与Java实现
    目录DES加密算法DES加密原理DES 加密算法Java实现前面阿粉说了关于 MD5 加密算法,还有 RSA 加密算法的实现,以及他们的前世今生,今天阿粉在来说一下这个关于 DES ...
    99+
    2022-11-13
    Java DES加密算法 Java DES加密 Java DES
  • 详解DES&3DES算法的原理以及C#和JS的实现
    目录一、简介1、DES 简介2、3DES 简介二、C# 代码实现1、DES2、3DES三、js 语言实现 1、DES2、3DES一、简介 1、DES 简介 DES 全称为 ...
    99+
    2023-03-19
    C# DES算法 JS DES算法 DES算法实现
  • python3实现Dijkstra算法最短路径的实现
    问题描述 现有一个有向赋权图。如下图所示: 问题:根据每条边的权值,求出从起点s到其他每个顶点的最短路径和最短路径的长度。 说明:不考虑权值为负的情况,否则会出现负值圈问题。 ...
    99+
    2024-04-02
  • Java实现与JS相同的Des加解密算法完整实例
    本文实例讲述了Java实现与JS相同的Des加解密算法。分享给大家供大家参考,具体如下:这里演示java与js实现相同的des加解密算法,不多说,不废话,直接上代码一、java实现package com.lyz.base.des;impor...
    99+
    2023-05-30
    java js des
  • DES&3DES算法原理及C#和JS实现的方法是什么
    这篇文章主要介绍“DES&3DES算法原理及C#和JS实现的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“DES&3DES算法原理及C#和JS实现的方法是什么”文章能帮助大...
    99+
    2023-07-05
  • 如何在Java项目中实现一个DES加密算法
    如何在Java项目中实现一个DES加密算法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Base64.javapackage com.mstf.des; import java...
    99+
    2023-05-31
    des加密 java
  • python3如何实现常见的排序算法
    小编给大家分享一下python3如何实现常见的排序算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!冒泡排序冒泡排序是一种简单的排序算法。它重复地走访过要排序的数...
    99+
    2023-06-20
  • Python3实现旋转数组的3种算法
    下面是python3实现的旋转数组的3种算法。一、题目给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。例如:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步:...
    99+
    2023-01-31
    数组 算法
  • 十大排序算法总结(Python3实现)
    目录   一、概述 二、算法简介及代码展示 1.冒泡排序 2.简单选择排序 3.简单插入排序 4.堆排序 5.快速排序 6.希尔排序 7.归并排序 8.计数排序 9.桶排序 10.基数排序 11.#代码说明 三、感悟总结 排序算法大概是...
    99+
    2023-01-31
    十大 算法
  • python基于pyDes库实现des加密的方法
    本文实例讲述了python基于pyDes库实现des加密的方法。分享给大家供大家参考,具体如下: 下载及简介地址:https://twhiteman.netfirms.com/des.html 如需要在py...
    99+
    2022-06-04
    方法 python pyDes
  • Node.js DES加密的简单实现
    常见的加密算法基本分为这几类,1 :线性散列算法、2:对称性加密算法、3、非对称性加密算法 (记记记) 线性散列算法(签名算法):MD5,SHA1,HMAC 比如MD5:即Message-Digest Al...
    99+
    2022-06-04
    简单 Node js
  • python3实现常见的排序算法(示例代码)
    冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列...
    99+
    2024-04-02
  • python3--递归函数,二分查找算法的实现
    enumerate枚举的用法例子1li = ['Sam', 'Tom', 'Jack', '老王'] for ind...
    99+
    2023-01-30
    递归 算法 函数
  • Python3实现打格点算法的GPU加速实例详解
    目录技术背景打格点算法实现打格点算法加速总结概要技术背景 在数学和物理学领域,总是充满了各种连续的函数模型。而当我们用现代计算机的技术去处理这些问题的时候,事实上是无法直接处理连续...
    99+
    2024-04-02
  • VB.NET如何实现DES加密
    这篇文章主要介绍了VB.NET如何实现DES加密,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。VB.NET DES加密代码:Imports System ...
    99+
    2023-06-17
  • 数据加密DES是一种什么算法
    DES是适用于计算机系统的商用密码,为一个分组加密算法,它以64位为分组对数据加密,64位一组的明文从算法的一端输入,64位的密文从另一段输出;且是一个对称算法,加密和解密用的是同一个算法。DES的密钥通常表示为64位的数,但每个第8位都用...
    99+
    2024-04-02
  • 运用Python3实现Two-Pass算法检测区域连通性
    目录技术背景Two-Pass算法测试数据的生成Two-Pass算法的实现算法的执行流程标签的重映射其他的测试用例总结概要参考链接技术背景 连通性检测是图论中常常遇到的一个问题,我们可...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作