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

准备工作

安装库为pycryptodome,直接安装Crypto,可能会找不到库,可以参阅这篇文章

python gmssl 加解密 python des加解密_python gmssl 加解密


里面的文件会帮我们直接安装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位的

python gmssl 加解密 python des加解密_python gmssl 加解密_02


python gmssl 加解密 python des加解密_python gmssl 加解密_03

参阅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编码为 字节对象

几个数据是这样的

python gmssl 加解密 python des加解密_DES_04


如果是中文是 这样的

python gmssl 加解密 python des加解密_初始化_05

转换为明文

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

先把密文用 base64解码 ,然后解密,再用utf-8解码