首先应该先要知道AES加密方式主要分为ECB和CBC,ECB是电码本模式,安全性较低,所以我仅仅写了对CBC的加密封装。
from Crypto.Cipher import AES
import base64
class AesCbc:
def __init__(self, iv, encode_='gbk'):
self.encode_ = encode_
self.model = AES.MODE_CBC
self.key = None
self.iv = self.encode_16(iv)
# 这里的密钥长度必须是16、24或32,目前16位的就够用了
def encode_16(self, par):
par = par.encode(self.encode_)
while len(par) % 16 != 0:
par += b'\x00'
return par
def encrypt(self, key, text):
text = self.encode_16(text)
print(key, self.encode_)
key = self.encode_16(key)
print(key, self.encode_)
aes_encrypt = AES.new(key, self.model, self.iv) # 创建一个aes对象
encrypt_text = aes_encrypt.encrypt(text)
return base64.encodebytes(encrypt_text).decode().strip()
def decrypt(self, key, text):
key = self.encode_16(key)
aes_decrypt = AES.new(key, self.model, self.iv)
text = base64.decodebytes(text.encode(self.encode_))
decrypt_text = aes_decrypt.decrypt(text)
return decrypt_text.decode(self.encode_).strip('\0')
if __name__ == '__main__':
AES_cbc = AesCbc('123456789')
en_text = AES_cbc.encrypt('1234567891011', '浙江省杭州市余杭区文一西路,27000,180XXXX1234,家用电器')
print('密文:', en_text)
print('明文:', AES_cbc.decrypt('1234567891011', en_text))
几个问题哈:
1.iv和key以及密文需要填充到16位。
2.TypeError: decrypt() cannot be called after encrypt():加密的AES.new不允许用于解密,需要重新初始化一个用来解密。
3.安装问题: ModuleNotFoundError:No module named "Crypto":装错库了,把多余的库删除只留下pycryptodome这个。