密码学—DES加密的IP置换Python程序

文章详细介绍了DES算法中IP初始置换与逆置换的过程,包括如何将数据转化为二进制,如何进行64位分组,以及如何利用固定的置换表进行置换。代码示例展示了如何编程实现这些步骤,特别强调了记录下标的重要性,以便在逆置换时恢复原始数据。

  • 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(st
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹等寒

谢过道友支持,在下就却之不恭了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值