用python实现DES加解密,并附带EBC和CBC两种分组加密模式

本文详细介绍了如何使用Python实现DES加密算法,包括EBC和CBC两种分组加密模式。通过提供完整的代码示例,帮助初学者理解并应用DES加密。文中还提供了加密和解密的交互式操作流程。
摘要由CSDN通过智能技术生成

之前在网上看了好多关于DES加解密的文章,很多都是直接贴代码,然而大多数都不能运行。花了一天写了个能运行的程序,其中有参考网上的一些好的代码。希望入了密码学坑的同学能得到帮助。python刚上手,代码很长,希望大家多多给出建议。

def keychanged(key):#秘钥初始置换,置换选择1
    pc1=(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,
         63, 55, 47, 39, 31, 33, 15,
         7, 62, 54, 46, 38, 30, 22,
         14, 6, 61, 53, 45, 37, 29,
         21, 13, 5, 28, 20, 12, 4)
    changed_key=''
    for i in range(56):
      changed_key+=key[pc1[i]-1]
    return changed_key

#将Unicode字符转换为16进制数   
def tohex(string):
    return_string=''
    for i in string:
        return_string+="%02x"%ord(i)
    return return_string

#将16进制数转换为2进制数
def _functionCharToA(code):
    return_code=''
    lens = len(code)
    lens=lens%16
    for key in code:
        code_ord=int(key,16)
        return_code+=_functionTos(code_ord,4)   
    if lens!=0:
        return_code+='0'*(16-lens)*4###如16进制数不为16倍数,则将剩余补为16位
    return return_code

#将16进制数转换为4位2进制数
def _functionTos(o,lens):
    return_code=''
    for i in range(lens):
        return_code=str(o>>i &1)+return_code
    return return_code

###将2进制字符串转换为16进制字符串
def binTohex(string):
    lens = len(string)
    tohex = ''
    for i in range(0,lens,4):
        list = string[i]+string[i+1]+string[i+2]+string[i+3]
        tohex +="%x"%int(list,2)
    return tohex

###将16进制转换为unicode字符
def tounicode(string):
    return_string=''
    string_len=len(string)
    for i in range(0,string_len,2):
        return_string+=chr(int(string[i:i+2],16))
    return return_string


#num = tohex(string)
#dnum = _functionCharToA(num)
#changedkey = keychanged(dnum)
#key_l = changedkey[0:28]
#key_r = changedkey[28:56]


###密钥可以转换为2进制数了

def roundKey(initkey):
    pc2= (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)
     
    d = (1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1)
    keylist = []
    key_l = initkey[0:28]
    key_r = initkey[28:56]
    for i in range(16):
        key_l = key_l[d[i]:28]+key_l[0:d[i]]
        key_r = key_r[d[i]:28]+key_r[0:d[i]]
        key = key_l+key_r
        return_list = ''
        for i in range(48):#密钥置换选择2
            return_list+=key[pc2[i]-1]
        keylist.append(return_list)
    return keylist
###将轮密钥存在keylist中
#keylist = []
#keylist = r

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值