Python實現AES加密(對稱加密)
阿新 • • 發佈:2018-12-20
from Cryptodome.Cipher import AES from binascii import b2a_hex,a2b_hex from Cryptodome import Random class AesEncryption(object): def __init__(self, key, mode=AES.MODE_CFB): self.key = self.check_key(key) # 金鑰key長度必須為16,24或者32bytes的長度 self.mode = mode self.iv = Random.new().read(AES.block_size) def check_key(self, key): '檢測key的長度是否為16,24或者32bytes的長度' try: if isinstance(key, bytes): assert len(key) in [16, 24, 32] return key elif isinstance(key, str): assert len(key.encode()) in [16, 24, 32] return key.encode() else: raise Exception(f'金鑰必須為str或bytes,不能為{type(key)}') except AssertionError: print('輸入的長度不正確') def check_data(self,data): '檢測加密的資料型別' if isinstance(data, str): data = data.encode() elif isinstance(data, bytes): pass else: raise Exception(f'加密的資料必須為str或bytes,不能為{type(data)}') return data def encrypt(self, data): ' 加密函式 ' data = self.check_data(data) cryptor = AES.new(self.key, self.mode,self.iv) return b2a_hex(cryptor.encrypt(data)).decode() def decrypt(self,data): ' 解密函式 ' data = self.check_data(data) cryptor = AES.new(self.key, self.mode,self.iv) return cryptor.decrypt(a2b_hex(data)).decode() if __name__ == '__main__': key = input('請輸入key:') data = '你真帥' aes = AesEncryption(key) e = aes.encrypt(data) # 呼叫加密函式 d = aes.decrypt(e) # 呼叫解密函式 print(e) print(d)