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解码