• DES发明人
    美国IBM公司W. Tuchman 和 C. Meyer1971-1972年研制成功。

IP初始置换与逆置换

  • 在DES中使用的都是发明者固定的表进行置换与逆置换,这里不知道为啥没人说是固定的,因为学习过程中没有这个提示真的很容易搞混(当然这对我来说是这样),如图所示

  • 上图中可以发现初始置换的表与逆置换的表对应着,比如IP初始中第一个数字为58(这里是初始置换后的数字) ,然后我们还原的时候就要去逆置换中找第58个(这里找的是第58个而不是58这个数字) ,因此在逆置换表中第58个的数字就是写着1,所以这两个表是对应着的。

  • 说实在点的就是初始置换中给的都是下标,然后初始置换的时候按照给出的数字下标在原数据中找到对应下标,然后放进表中即可。(比如58,那就在原数据中找到下标为58的放在第一位以此类推,逆置换也如此操作)

  • 注意事项:

    • 一定不要忘记的就是IP置换与逆置换的表都不用我们弄,是人家弄好了按照这个来就行了,我们不用自己去特定生成两个表来弄。
    • 置换必须要转化为二进制数
    • 置换中二进制数必须每一次置换都为64位,64位进64位出。

编程想法

转二进制过程中的提取一些数据

全为字符串形式

  • 声明:我这里的代码块全部导出自我写的类中的函数,因此会带有一些类的变量。

  • 首先将数据全部转化为二进制数,我首先就很简单将其去哪不使用bin转为二进制数据,然后将其去掉ob前缀之后再使用join转为字符串最后全部添加进一个字符串变量里,并且join之前用了一个空格将其隔开(因为待会分组记录下标的时候要用空格进行推理,下一个数据对应的下标就是空格的下标减去前面空格出现的次数就是解码的时候要用到的下标)

  • 为啥要减去前面空格出现的次数,因为空格出现的次数就是我添加下标的次数,然后解码的时候是不用空格的,是用空格spilt掉然后空格就没有了,所以在这里添加的下标应该是预测到后面解码要用到的下标。(这是一段解释)

  • 添加好下标之后就要将其组合了,因为我们的空格已经发挥了他的作用了,所以就将空格全部去掉,然后将其所有二进制数据组合成一串连续的二进制数字,这也是我们要将其下标记录的原因,我们一旦将其组合成串二进制数字的时候,如果直接转回字符就转不回来了,因为我们需要的不是一串而是分开的一段一段的字母或者中文等等。

  • 去掉空格之后就是一串01数字了,由于我们IP置换需要满足64的,所以我们要确保这一堆二进制数字长度是64的倍数到时候才好分组,如果不够64位的就在后面补0将其补齐64位
    这里不用担心补0在逆置换还原回来的时候会出错,虽然补0是补在后面但是我们是有记录下标的,所以我们只要使用下标还原回数据的时候后面多余的去掉即可

        def enByte(self, s):
    str_bin = []
    tmp = []
    s = str(s)
    index_list = []
    temp_index = 0
    for c in s:
    t = bin(ord(c)).replace('0b', '')
    temp_index += (len(t) - 1)
    # index_list.append(temp_index) # 存储每一个数据的下标,还原数据的时候需要
    tmp.append(t) # 将0b前缀去掉
    str_bin = ' '.join(tmp)
    for i in range(len(str_bin)):
    if i == 0:
    index_list.append(0)
    continue
    if str_bin[i - 1] == ' ' and str_bin[i] != ' ':
    '''空格在这里的作用就是记录下标然后
    len(index_list)计算出一共添加了几次下标
    就是一共有几个空格了,
    因此在这里可以直接推出该数据开始的下标'''
    index_list.append(i - len(index_list)) lastTail = 0
    str_bin = str_bin.replace(' ', '')
    str_len = len(str_bin)
    index_list.append(str_len) for i in range(64 - ((len(str_bin) % 64))): # 补0
    lastTail += 1
    str_bin += '0'
    self.lastTail = lastTail
    self.length = len(str_bin)
    return str_bin, index_list

64为一组

转二进制过程中提取了一些有用的数据之后,现在就是需要将这一坨64倍数的二进制数据分组了,每组64,在这里不用担心是否满足64倍数,因为在转二进制的时候已经补0了(现在我觉得还是把补0操作放到分组这个函数里面比较好,因为补0比较适合分组的这个功能,转二进制的时候就干干净净的进行二进制转换就好了,果然我还是太年轻了)

  • 遍历数据,64为一组即可(模64存一组数据)

        def groupBy64(self, data):
    temp = ''
    mess = []
    for i in range(len(data)):
    temp += data[i]
    if (i + 1) % 64 == 0 and i != 0:
    mess.append(temp)
    temp = ''
    return mess

IP置换

当上述工作完成之后就轻松很多了。我当时也松了一口气,没想到DES这么一步花了我这么多心思。

  • IP置换函数
    很明显这里需要使用固定的IP初始置换表,因为规定的就是这样(不要自己弄一个表出来,因为在DES中其他表没有意义。)

        def IP(self, data):
    ip = [
    # left
    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,
    # right
    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
    ] # ip置换表
    data_ = []
    for i in ip:
    data_.append(str(data[i - 1]))
    time = 1
    self.message += ('\nIP置换:\n')
    for i in data_:
    self.message += (i + ',')
    if time % 8 == 0: self.message += '\n'
    time += 1
    data_ = ''.join(data_)
    return data_
  • 下面代码是使用了上面做的工作之后,直接调用的函数.

    • 说明
      里面有一段这样的代码,这里是为了我打印出来方便对比的,这不就是纯属打印出来给我看的测试代码,可以不写,也可以对应到其他功能:比如我这个就是哟啊给到pyqt5界面的数据打印出来。
    temp_byte = ''
    for i in range(1, len(self.index_list)):
    temp_byte += bin_byte[self.index_list[i - 1]:self.index_list[i]] + ' '
    else:
    temp_byte += bin_byte[self.index_list[i]:] + ' '
  • 这里是最终IP置换函数

        def goto_IP(self):
    str_mess = self.input_text.toPlainText() #接收输入的文本 #这里采用了一个记录下标的方法,因为我们是一次性置换然后再逆置换,记录下标方便使用
    data, self.index_list = self.enByte(str_mess)
    data_list = self.groupBy64(data) # .replace(' ','')
    bin_byte = ''
    for m in data_list:
    bin_byte += self.IP(m)
    temp_byte = ''
    for i in range(1, len(self.index_list)):
    temp_byte += bin_byte[self.index_list[i - 1]:self.index_list[i]] + ' '
    else:
    temp_byte += bin_byte[self.index_list[i]:] + ' ' self.end_byte = temp_byte
    result = '=============IP置换===========\n' + self.message + \
    '\n\n=====IP置换后的二进制数据======\n' + temp_byte
    return result

IP逆置换

  • 解码函数
    里面有一个try catch,原因是因为我在解码的时候发现IP初始置换后置换出的二进制数据是一些奇奇怪怪的字符或者说根本不在utf-8字符集中,因此如果含有不在utd-8字符集中就会报错,但是由于我这个是给IP初始置换后将其置换的二进制数据转为字符的,因此需要做这么一步操作,如果是IP逆置换回原本的数据就不用try catch这一步,但是因为我要代码复用这个函数所以有好过没有。

  • 解码必须要用到的就是下标,因此刚刚存全局的下标变量列表就起到作用了,在这里用下标将其一坨二进制数据切分成对应原本二进制字符串的数据才能进行转一个个的ASCII码值然后才能由正确的ASCII转为原字符数据

        def deByte(self, mess, index):
    data = ''
    byte_s = []
    for i in range(1, len(index)):
    s = ''
    s = mess[index[i - 1]:index[i]]
    byte_s.append(s)
    # 开始解码
    Error_Mess = ''
    for bs in byte_s:
    try:
    s = chr(int(bs, 2))
    data += s
    except:
    Error_Mess = 'utf-8没有尾部补0的编码映射报错,不建议直接使用字符进一步加密'
    continue
    """使用该方式将过于长的补0尾部去掉,因为0不影响,
    所以即使打印出来也不会有影响,
    在这里只能采用这种方式进行优化,
    否则utf-8没有尾部补0的编码映射会报错""" return data, Error_Mess
  • IP逆置换
    依旧是DES设计者给出的固定置换表,不能更改。

        def IP_1(self, data):  # 最后一步IP逆置换
    ip_1 = [
    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
    ]
    re_data = ''
    for i in ip_1:
    re_data += data[i - 1]
    return re_data
  • 最后汇总IP逆置调用的函数依旧是上述准备工作中弄好的函数

        def backto_IP(self):
    data = self.end_byte
    data = data.replace(' ', '')
    data_list = self.groupBy64(data) # .replace(' ','')
    bin_byte = ''
    for m in data_list:
    bin_byte += self.IP_1(m) str_mess ,Error_Mess = self.deByte(bin_byte,self.index_list)
    return str_mess

不知道各位道友是否觉得这个IP置换有种让人非常不舒服感觉。

密码学—DES加密的IP置换Python程序的更多相关文章

  1. 快速搭建python程序

    公司对外提供了http接口服务,涉及到了des加密,有客户用Python开发,但搞不定加密,客户的问题就是大问题,虽然以前没接触过Python,也只能硬着头皮上,不停的baidu各种资料,从环境搭建. ...

  2. Python实现基于DES加密源码的文本加密器

    这是自行制作的一个DES文本加密工具 最终效果图: 本加密器支持UTF-8字符的加解密(包含中文),由于其中的编码方式与常用编码方式不同,加密结果与网上工具不同,但是能实现正常加解密. 最终目标: 目 ...

  3. PYTHON实现DES加密及base64源码

    要求是实现DES加密,解密,我是用python实现的,还是有挺多坑的,改bug就改了挺久,加密实现后,解密过程就比较轻松. 另外,附加base64编码源码 要求:输入秘钥为64位二进制数(有效位为56 ...

  4. paip.提升安全性----Des加密 java php python的实现总结

    paip.提升安全性----Des加密 java php python的实现总结 ///////////    uapi         private static String decryptBy ...

  5. Android和java平台 DES加密解密互通程序及其不能互通的原因

    网上的demo一搜一大堆,但是,基本上都是一知半解(包括我).为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DES 加密和java DES加密的程序不能互通.就是加密的结果不一样 ...

  6. 为你的Python程序加密

      在实际的工作中,有时候我们需要部署自己的Python应用,但这时候我们并不希望别人能够看到自己的Python源程序.因此,我们需要为自己的源代码进行加密,Python已经为我们提供了这样一套工作机 ...

  7. 如何给python程序加密

    在实际的工作中,有时候我们需要部署自己的Python应用,但这时候我们并不希望别人能够看到自己的Python源程序.因此,我们需要为自己的源代码进行加密,Python已经为我们提供了这样一套工作机制. ...

  8. 微信小程序des加密、PHP des解密

    最近在做对小程序传输数据进行加密,加密方法有很多,使用的是des对称加密 采用的是CBC模式, 引用的插件为tripledes.js,https://github.com/Favour1111in/h ...

  9. pyDes库 实现python的des加密

    下载及简介地址:https://twhiteman.netfirms.com/des.html 如需要在python中使用des加密,可以直接使用pyDes库加密,该库提供了CBC和ECB两种加密方式 ...

  10. python和c#通用一致的des加密采用CBC和PKCS7

    在python下可以下载pydes 下载地址为 http://pydes.sourceforge.net/ 在c#下实现des加密较为简单,如下: using System; using System ...

随机推荐

  1. 80+产品正通过兼容性测试,OpenHarmony生态蓬勃发展

    4 月 25 日,开放原子开源基金会举办了 OpenAtom OpenHarmony(以下简称"OpenHarmony")技术日活动,OpenHarmony PMC 委员代表首次对 ...

  2. Python 内置数据类型详解

    内置数据类型 在编程中,数据类型是一个重要的概念. 变量可以存储不同类型的数据,不同类型可以执行不同的操作. Python默认内置了以下这些数据类型,分为以下几类: 文本类型:str 数值类型:int ...

  3. Matplotlib绘图设置---坐标轴刻度和标签设置

    每个axes对象都有xaxis和yaxis属性,且xaxis和yaxis的每一个坐标轴都有主要刻度线/标签和次要刻度线/标签组成,标签位置通过一个Locator对象设置,标签格式通过一个Formatt ...

  4. 成为一名 BI数据分析师,这些能力不能少

    近些年来,随着数据技能的日益普及和数据工具的不断简化,大数据技术的迅速发展催生了很多新生职业,BI数据分析师就是其中一个岗位. 说到BI数据分析,我们首先要说的是 BI,它的全称是 Business ...

  5. centos部署Django三:编写相关配置文件及启动服务

    1. 进入到项目的根目录,编写 uwsgi.xml 配置文件 *:centos用的不是 uwsgi.ini,而是 uwsgi.xml <uwsgi> <socket>127.0 ...

  6. Qt 实现涂鸦板一:简易涂鸦板

    新建一个Qt项目,在 .h 文件中写入 #pragma once #include <QtWidgets/QWidget> #include "ui_xuexi.h" ...

  7. MogDB/opengauss触发器简介(1)

    MogDB/opengauss 触发器简介(1) 触发器是对应用动作的响应机制,当应用对一个对象发起 DML 操作时,就会产生一个触发事件(Event).如果该对象上拥有该事件对应的触发器,那么就会检 ...

  8. 一、Unity调用Xcode封装方法(工程引用文件)

    1.Xcode新建Static Library 工程 (我起的名字是UnityExtend 可以在接下来的图中看到) 2.打包unity ios工程 unity打包ios 打出Xcode工程 3.打开 ...

  9. sql 语句系列(字符串之父与子之间)[八百章之第十二章]

    前言 介绍字符串和其子字符串直接的使用. 判断含有子字母的字符串 select * from emp 在mysql中: select emp.ename from emp where emp.enam ...

  10. 距离传感器GT2的使用介绍

    一. 1.使用注意要点: (1)要使用到"清零"功能. 确定其内部清零软元件,认准"外部请求",注意组别容易混淆. (2)如果要用到"复位" ...