python DES算法的原理及实现

最近在完成电子商务安全的一个小作业,实现DES算法,经过一番查阅资料以及三个晚上的爆肝,终于完成了任务,下面用简单的文字描述一下这个过程。

 1. 把明文按照一张表置换位置。
 2. 把初始密钥按照一张表置换位置。
 3. 进入16轮的迭代,每一轮迭代首先根据轮数与移动位数所对应的表生成子密钥。如果是加密的话,就是密
 钥按照表左移指定位数,解密就是按照表右移指定位数。
 4. 得到每一轮的子密钥过后,将要加密数据的右边按照一张表扩展成48位,然后把这个扩展的数据与该轮的
 子密钥进行异或处理,再将结果输入S盒,由于6进4出,所以S盒过后得到32位的数据。
 5. S盒过后得到的数据再进入P盒,按照一张表置换位置,再将结果与数据的左半部分异或,之后第一轮迭代
 过后的数据就等于数据的右半部分加上异或结果
 6. 在完成16次迭代过后再按照一张表进行逆置换,得到最终的结果(即加密或解密后的结果)

下面来介绍一下我的具体实现,代码使用python实现的:
Input:64位的二进制表示的明文和初始密钥以及模式,若为加密,则模式参数为E,解密为D。
Output:显示原文和加密结果。

在我的例子中,我的明文和初始密钥均为’0123456789ABCDEF’,加密过后的密文为’56cc09e7cfdc4cef’,在完成加密过后,再用加密过后的密文与初始密钥进行解密,得到的解密结果为’0123456789ABCDEF’,故验证了其正确性。

下面是代码:

# -*- coding: utf-8 -*-
"""
Created on Thu Apr  4 21:38:22 2019

@author: zhhandsome
"""
def hex2bin(text):
    ret = ''
    for i in text:
        tmp = bin(int(i, 16))[2:]
        ret += '0'*(4-len(tmp)) + tmp
    return ret

def bin2hex(text):
    ret = ''
    for i in range(0, len(text), 4):
        tmp = text[i:i+4]
        ret += hex(int(tmp, 2))[2:]
    return ret

class DES_ECB:
    def __init__(self, text, key, mode):
        self.original_text = text
        self.text = text
        self.key = key
        self.mode = mode
        self.ring_shift_left = [1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]
        self.ring_shift_right = [0,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]
        self.PC_2 = [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]
        self.S_box = [[] for i in range(8)]
        self.S
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值