#!/usr/bin/env pythonimport base64
from Crypto import Random
from Crypto.Cipher import AES
classAESCipher(object):"""
A classical AES Cipher. Can use any size of data and any size of password thanks to padding.
Also ensure the coherence and the type of the data with a unicode to byte converter.
"""def__init__(self, key):
self.bs =32iflen(key)>=32:
self.key = key[:32]else:
self.key = self._pad(key)
@staticmethoddefstr_to_bytes(data):
u_type =type(b''.decode('utf8'))ifisinstance(data, u_type):return data.encode('utf8')return data
def_pad(self, s):return s +(self.bs -len(s)% self.bs)* AESCipher.str_to_bytes(chr(self.bs -len(s)% self.bs))
@staticmethoddef_unpad(s):return s[:-ord(s[len(s)-1:])]defencrypt(self, raw):
raw = self._pad(AESCipher.str_to_bytes(raw))
iv = Random.new().read(AES.block_size)
cipher = AES.new(self.key, AES.MODE_CBC, iv)return base64.b64encode(iv + cipher.encrypt(raw)).decode('utf-8')defdecrypt(self, enc):
enc = base64.b64decode(enc)
iv = enc[:AES.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)return self._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')if __name__ =='__main__':# print(base64.b64decode('dnQkZGRnbDFwYmI3N3heaA=='))
cipher = AESCipher('098f6bcd4621d373cade4e832627b4f6')
cry_str ='test'
encrypted = cipher.encrypt(cry_str)import urllib.parse
encrypted = urllib.parse.unquote(encrypted)
decrypted = cipher.decrypt(encrypted)print(encrypted)print(decrypted)