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

 

posted @ 2019-01-22 08:55  st--st  阅读(1626)  评论(0编辑  收藏  举报