AES加密解密
AES加密
注意:
1.密钥必须是16个字节,加密的文本必须是16字节的倍数。
2.加密的文本是str类型,得到的加密后的结果是bytes类型。
from Crypto.Cipher import AES
# 加密
def encrypt(message):
'''
加密,密钥必须16个字节,加密的文本的字节数必须是16字节的倍数
:param message:
:return:
'''
# 用于加密的密钥,长度必须16个字节
key = b'xvfsdfdgaefsdfsd'
# 初始化加密器
cipher = AES.new(key,AES.MODE_CBC,key)
# 将加密文本转为字节
ba_data = bytearray(message,encoding='utf-8')
# 获取文本的字节数
l1 = len(ba_data)
# 求余数,如果余数为0,即将16个字节加入到字节数组,如果余数不为0,将16-余数的字节加入到字节数组
rem = l1 % 16
if rem == 0:
v1 = 16
else:
v1 = 16 - rem
for i in range(v1):
ba_data.append(v1)
# 将16倍数字节转化为字符串
final_data = ba_data.decode('utf-8')
# 加密,加密文本必须是字符串,加密后得到字节类型的数据
msg = cipher.encrypt(final_data)
return msg # bytes类型
'''测试'''
a = encrypt("abc")
print(a) # b'\xc2\xadL\xab\xef\xaa\xb1}\x92\xf22\x83L\xec\xf0\x90'
print(len(a)) # 16
AES解密
注意:
1.解密的文本必须是bytes类型,而且是16的倍数
2.解密后的结果是bytes类型,记得去除补全的字节,获取真正的数据
3.将数据转换为str类型
from Crypto.Cipher import AES
# 解密
def decrypt(message):
# 密钥,必须16个字节
key = b'xvfsdfdgaefsdfsd'
# 初始化加密器
cipher = AES.new(key,AES.MODE_CBC,key)
# 解密,传入的必须是bytes类型,得到bytes类型的数据
result = cipher.decrypt(message)
# 去除补全的字节,获取真正的加密内容
data = result[0:-result[-1]]
# 转化为str类型
return str(data,encoding='utf-8')
'''测试'''
encrypt_msg = encrypt("abc") # b'\xc2\xadL\xab\xef\xaa\xb1}\x92\xf22\x83L\xec\xf0\x90'
decrypt_msg = decrypt(encrypt_msg)
print(decrypt_msg) # abc