from Crypto.Cipher import AES
# aes加密解密 def pkcs7padding(self,text): """ 明文使用PKCS7填充 最終調用AES加密方法時,傳入的是一個byte數組,要求是16的整數倍,因此需要對明文進行處理 :param text: 待加密內容(明文) :return: """ bs = AES.block_size # 16 length = len(text) bytes_length = len(bytes(text, encoding='utf-8')) # tips:utf-8編碼時,英文占1個byte,而中文占3個byte padding_size = length if (bytes_length == length) else bytes_length padding = bs - padding_size % bs # tips:chr(padding)看與其它語言的約定,有的會使用'\0' padding_text = chr(padding) * padding return text + padding_text def pkcs7unpadding(self,text): """ 處理使用PKCS7填充過的數據 :param text: 解密后的字符串 :return: """ length = len(text) unpadding = ord(text[length - 1]) return text[0:length - unpadding] def aescode(self, type_, str_): thirdpass_key = b'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' thirdpass_iv = b'aaaaaaaaaaaaaaaa' key = thirdpass_key # 32bytes iv = thirdpass_iv # 還需要使用iv一個向量. # 使用key和iv初始化AES對象, 使用MODE_CFB模式. try: aesobj = AES.new(key, AES.MODE_CBC, iv) except Exception as e: return (False, 'aes初始化失敗') try: if type_ == 'encode': # 處理明文 content_padding = self.pkcs7padding(str_) data_str = content_padding.encode("utf-8") aesencode = base64.b64encode(aesobj.encrypt(data_str)).decode() return (True, aesencode) elif type_ == 'decode': # 處理明文 data_str = str_.encode("utf-8") aesdecode = aesobj.decrypt(base64.b64decode(data_str)).decode() aesdecode = self.pkcs7unpadding(aesdecode) return (True, aesdecode) else: return (False, 'type_ is encode/decode') except Exception as e: return (False, 'aes方法報錯')
[True, 'CCAVPBaD6gptwAeGwtC0Rw==']
(True, '{"k": "a"}'