方案一
- 依赖python == 3.8.10
- 依赖包:pycryptodome == 3.22.0
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
class AESCipher(object):
def __init__(self, key):
self.encoder = 'utf-8'
self.key = key.encode(self.encoder)
self.mode = AES.MODE_ECB
self.style = 'pkcs7'
self.aes = AES.new(self.key, self.mode)
def encrypt(self, text):
"""
加密
"""
pad_text = pad(text.encode(self.encoder), AES.block_size, style=self.style)
encrypt_text = self.aes.encrypt(pad_text)
encrypt_text_str = str(base64.encodebytes(encrypt_text), encoding=self.encoder)
return encrypt_text_str.replace('\n', '')
def decrypt(self, text):
"""
解密
"""
ciphertext = base64.b64decode(text)
decrypted_data = self.aes.decrypt(ciphertext)
plaintext = unpad(decrypted_data, AES.block_size, style=self.style)
return plaintext.decode('utf-8')
text = '这只是一个测试明文, this is just a test'
ase = AESCipher(key='12345ABCDE654321')
encrypt_text = ase.encrypt(text)
print(encrypt_text)
decrypt_text = ase.decrypt(encrypt_text)
print(decrypt_text)
print(text == decrypt_text)
方案二
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
class AesCode(object):
def __init__(self, key='1234567812345678', iv='1234567812345678', mode=AES.MODE_CBC):
self.key = key.encode('utf-8')
self.iv = iv.encode('utf-8')
self.mode = mode
@staticmethod
def bytePad(text, byteAlignLen=16):
count = len(text)
mod_num = count % byteAlignLen
if mod_num == 0:
return text
add_num = byteAlignLen - mod_num
return text + chr(add_num).encode('utf8') * add_num
def encode(self, text):
aes = AES.new(key=self.key, iv=self.iv, mode=self.mode)
enc_text=self.bytePad(text.encode('utf-8'),16)
p = aes.encrypt(enc_text)
return b2a_hex(p).decode('utf8')
def decode(self, text):
aes = AES.new(key=self.key, iv=self.iv, mode=self.mode)
text = text.replace('*屏蔽的关键字*', '')
hex_text = a2b_hex(text.strip())
pad_text = self.bytePad(hex_text, 16)
res = aes.decrypt(pad_text)
return res.decode('utf8')
aes = AesCode()