【Python】Crypto模块_AES/CBC/PKCS5Padding 加解密
AES/CBC/PKCS5Padding
引用包
import base64 from Crypto.Cipher import AES
加解密
# coding:utf-8 import base64 from Crypto.Cipher import AES from xxx.logger import * class AESCipher: ''' AES/CBC/PKCS5Padding ''' def __init__(self): # 秘钥:必须是16位字节或者24位字节或者32位字节(因为python3的字符串是unicode编码,需要 encode才可以转换成字节型数据) self.key = "YWJjZGVmYWJjZGVmMTIzNA==" self.key = base64.b64decode(self.key) # 偏移量--必须16字节 self.iv = "MTIzNGFiY2RlZmFiY2RlZg==" self.iv = base64.b64decode(self.iv) def aes_cbc_encrypt(self, text): """ AES/CBC/PKCS5Padding 加密 """ BLOCK_SIZE = AES.block_size # 需要加密的文件,不足BLOCK_SIZE的补位(text可能是含中文,而中文字符utf-8编码占3个位置,gbk是2,所以需要以len(text.encode()),而不是len(text)计算补码) text = text + (BLOCK_SIZE - len(text.encode()) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(text.encode()) % BLOCK_SIZE) # # base64解密 # key = base64.b64decode(self.key) # iv = base64.b64decode(self.iv) # 创建一个aes对象 key 秘钥 mdoe 定义模式 iv#偏移量--必须16字节 cipher = AES.new(key=self.key, mode=AES.MODE_CBC, IV=self.iv) # 利用AES对象进行加密 encrypted_text = cipher.encrypt(text.encode()) return base64.b64encode(encrypted_text).decode('utf-8') def aes_cbc_decrypt(self, encrypted_text): """ AES/CBC/PKCS5Padding 解密 """ # 需要解密的文件 encrypted_text = base64.b64decode(encrypted_text) # # base64解密 # key = base64.b64decode(self.key) # iv = base64.b64decode(self.iv) # cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=iv) # 创建一个aes对象 key 秘钥 mdoe 定义模式 iv#偏移量--必须16字节 cipher = AES.new(key=self.key, mode=AES.MODE_CBC, IV=self.iv) # 利用AES对象进行解密 decrypted_text = cipher.decrypt(encrypted_text) # 去除补位 dec_res = decrypted_text[:-ord(decrypted_text[len(decrypted_text) - 1:])] return dec_res.decode() if __name__ == "__main__": # 加密 msg = " AES/CBC/PKCS5Padding 加密msg 巴拉巴拉balabala " jiami = AESCipher().aes_cbc_encrypt(msg) logs.debug(jiami) # 解密 jiemi = AESCipher().aes_cbc_decrypt(jiami) logs.debug(jiemi)
运行结果:
拓展
加密数据补位写法
# 方法一 # 不足BLOCK_SIZE的补位(s可能是含中文,而中文字符utf-8编码占3个位置,gbk是2,所以需要以len(s.encode()),而不是len(s)计算补码) pad = lambda s: s + (BLOCK_SIZE - len(s.encode()) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(s.encode()) % BLOCK_SIZE) #################################################################################################################### # 方法二 def pad(data): length = BLOCK_SIZE - (len(data) % BLOCK_SIZE) #return data + (chr(length) * length).encode() return data.encode(encoding='utf-8') + (chr(length)*length).encode(encoding='utf-8')
去除补位写法
# 方法一
# 去除补位 unpad = lambda s: s[:-ord(s[len(s) - 1:])] ########################################################################################################## # 方法二 def unpad(data): return data[:-(data[-1] if type(data[-1]) == int else ord(data[-1]))]
lambda 匿名函数:https://www.cnblogs.com/phoenixy/p/15796559.html
-------------------------------------------------------------------------------------
如果万事开头难 那请结局一定圆满 @ Phoenixy
-------------------------------------------------------------------------------------