安装插件
crypto != pip install crypto 不要直接安装
pip install pycryptodome # 安装pycryptodome
from Crypto.Cipher import AES
import base64
# DES --- 对称
# AES --- 对称 (用它 -- 加密、解密)
# RC4 --- 对称
# 代码-- 实现 -- 库应该是什么?
# crypto != pip install crypto 不要直接安装
# pip install pycryptodome # 安装pycryptodome
class EncryptDate:
# 构造方法
def __init__(self, key):
# 密码,同时要变成一个utf-8
self.key = key.encode("utf-8")
# 长度,默认是16--初始化
self.length = AES.block_size
# 加密的模式设置一下
self.aes = AES.new(self.key, AES.MODE_ECB)
def pad(self, text): # tony
"""
#填充函数,使被加密数据的字节码长度是block_size的整数倍
"""
# 计算它的长度
count = len(text.encode('utf-8'))
print(count)
# 传过来的是4位 -- 补齐:12位
# 传过来的是8位 -- 补齐:8位
# 传过来的是20位 -- 补齐:12位
print('*' * 50)
print(self.length)
print('*' * 50)
# 问题:怎么补齐对应的位数:= 16 -(count%16) :
add = self.length - (count % self.length)
entext = text + (chr(add) * add)
return entext
# 加密
def encrypt(self, text):
# 把数据变成utf-8 -- 16
# 问题:传过来的数据一定是16的倍数吗?
# 解决:写一个方法,把text缺少的部分数据进行补全
# self.aes.encrypt(text.encode("utf-8"))
# 1. 进行加密:encrypt()自带
res = self.aes.encrypt(self.pad(text).encode("utf8"))
# 2. 把对应的数据再转成base64位
msg = str(base64.b64encode(res), encoding ="utf8")
# 3. 返回
return msg
# 解密
def decrypt(self, decrData): # 解密函数
# 1. 把对应的数据转成base64(前提把他变成utf-8)
res = base64.decodebytes(decrData.encode("utf8"))
msg = self.aes.decrypt(res).decode("utf8")
# 会把部位的输出,所以要去掉。
# return self.unpad(msg)
return msg
if __name__ == '__main__':
# 秘钥都是通过key去获取
key = "1234567812345678"
ase = EncryptDate(key)
data = ase.encrypt(str("tony"))
print(data)
print("---解密---")
text = "XbXHJrNLwoTVcyfqM9eTgQ=="
data = ase.decrypt(text)
print(data)