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