windos    pip install Crypto   pip install pycryptodome

import base64
import ast
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex


class AesCBC:
    key = 'kjgloismvkclsxkw'.encode('utf-8')    #16位
    iv = b'klijthslkicjxlkw'   # 16位

    # 如果text不足16位的倍数就用空格补足为16位
    def add_to_16(self, text):
        if len(text.encode('utf-8')) % 16:
            add = 16 - (len(text.encode('utf-8')) % 16)
        else:
            add = 0
        text = text + ('\0' * add)
        return text.encode('utf-8')

    def encrypt(self, text) -> str:
        # 加密函数
        mode = AES.MODE_CBC
        text = self.add_to_16(text)
        cryptos = AES.new(self.key, mode, self.iv)
        cipher_text = cryptos.encrypt(text)
        # 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串
        return str(base64.b64encode(b2a_hex(cipher_text)), encoding='utf-8')

    # 解密后,去掉补足的空格用strip() 去掉
    def decrypt(self, text):
        text = base64.b64decode(text)
        mode = AES.MODE_CBC
        cryptos = AES.new(self.key, mode, self.iv)
        plain_text = cryptos.decrypt(a2b_hex(text))
        return bytes.decode(plain_text).rstrip('\0')


# if __name__ == '__main__':
#     e = AesCBC().encrypt("""{"username":"test"}""")  # 加密
#     d = AesCBC().decrypt(e)  # 解密
#     print("加密:", e)
#     print("解密:", d)
#     # print(type(d))
#     print(ast.literal_eval(d)['username'])