2021-09-25-python DES加解密

该博客介绍了如何使用Python的pycryptodome库进行DES加密和解密操作。代码示例中创建了一个DESCrypter类,实现了秘钥和初始化向量的设置,以及加密和解密方法。加密过程包括字符串的补全和Base64编码,解密过程则是Base64解码后去除填充。示例中使用了8位秘钥和初始化向量,并展示了对英文字符串的加密和解密过程。
摘要由CSDN通过智能技术生成

DES是分组加密算法,秘钥长度为56位,加密后的长度是8的整数倍,数据交互的双方必须有相同的秘钥

准备工作

安装库为pycryptodome,直接安装Crypto,可能会找不到库,可以参阅这篇文章
在这里插入图片描述
里面的文件会帮我们直接安装Crypto库

示例代码解析


import base64

from Crypto.Cipher import DES

class DESCrypter():

    def __init__(self, key, iv=None):
        self.key = key
        if iv:
            self.iv = iv
        else:
            self.iv = key
        self.mode = DES.MODE_CBC
        self.BS = len(key)
        # 如果刚好是s是BS的倍数,那么补一组
        self.pad = lambda s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) % self.BS).encode()
        self.unpad = lambda s: s[0:-s[-1]]
        self.generator_en = DES.new(self.key, self.mode,self.iv)
        self.generator_de = DES.new(self.key, self.mode,self.iv)

    def encrypt(self, en_data):
        return self.generator_en.encrypt(self.pad(en_data))

    def decrypt(self, de_data):
        return self.unpad(self.generator_de.decrypt(de_data))

if __name__ == '__main__':

    key = b'00000000'  # 秘钥强制是8位
    iv = b'12345678'
    des = DESCrypter(key,iv)
    data = 'amoer'
    # 加密
    en_data = base64.b64encode(des.encrypt(data.encode('utf-8')))
    print(en_data)  
    # 解密
    de_data = des.decrypt(base64.b64decode(en_data)).decode('utf-8')
    print(de_data)

此处封装一个DES加解密的类,先是导入DES函数

def __init__(self, key, iv=None):

此处key是秘钥,iv是一个初始化向量,都是8位的
在这里插入图片描述
在这里插入图片描述

参阅DES文件-源代码中的new方法,key参数解释的第二行,iv参数解释的第四行
mode:选择CBC模式,密文分组链接模式

        self.mode = DES.MODE_CBC

BS:秘钥的长度
pad:被加密字符串长度不是8的倍数时补齐的方法,并返回补齐的字符串

        self.pad = lambda s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) % self.BS).encode()

s即为传入的字符串,此处lambda函数参数 为s,返回s+(秘钥长度-字符串长度除以秘钥长度的余数)*这个 余数在ASCII字符集里面的代号的 编码
unpad:未补齐位数前的字符串

        self.unpad = lambda s: s[0:-s[-1]]

s[-1]可以取得补齐后字符串的最后一位,前面用余数在ASCII字符集里面的代号的 编码来补齐,所以这一位指明了补了多少位,相应的切割字符串就可以获得原文。
generator_en和 generator_de :将DES的new函数赋值给他,创建了一个新的DES密码
encrypt方法:调用generator_en的encrypt方法处理补齐的字符串

        return self.generator_en.encrypt(self.pad(en_data))

decrypt方法:调用generator_de 的decrypt方法解密后去除补齐的文字

        return self.unpad(self.generator_de.decrypt(de_data))

使用

秘钥与初始化向量

key = b'00000000'
iv = b'12345678'

初始化一个DESCrypter对象

    des = DESCrypter(key,iv)

明文数据

    data = 'amoer'

转换为密文

    en_data = base64.b64encode(des.encrypt(data.encode('utf-8')))

这里先将数据翻译为utf-8编码,然后再加密,再通过base64编码为 字节对象
几个数据是这样的
在这里插入图片描述
如果是中文是 这样的
在这里插入图片描述

转换为明文

    de_data = des.decrypt(base64.b64decode(en_data)).decode('utf-8')

先把密文用 base64解码 ,然后解密,再用utf-8解码
即可得到原文

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Amoor123

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值