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'])