Python实现AES加密解密

报错:

TypeError: decrypt() cannot be called after encrypt()

原因:

cryptor不能写在主函数中同时给加密函数与解密函数使用,尽管加密解密都是用: cryptor = AES.new(key, mode, iv),

但若将其定义在main并分别传给加密解密同时使用时,会报错。

解决:

在加密与解密方法分别写cryptor = AES.new(key, mode, iv)

报错:

ValueError: Incorrect IV length (it must be 16 bytes long)

原因:

偏移量必须16位

报错:

ValueError: Incorrect AES key length

原因:

密钥长度需为16的倍数

注意:

需加密的内容必须大于密钥长度且为16倍数

实现:

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

# 密钥在使用该方法时可补足为16倍数
# 偏移量在使用该方法时,在不足16位时补为16位
# 偏移量必须为16位,不可多
def legth(value):
    l = len(value)
    flag = l % 16
    if flag != 0:
        add = 16 - (l % 16)
        value = value + ('\0' * add).encode('utf-8')
    return value


def encryp_str(content, key, mode, iv):
    cryptor = AES.new(key, mode, iv)
    # 被加密内容需大于密钥长度,且为16倍数
    key_length = len(key)
    content_legth = len(content)
    if content_legth < key_length:
        add = key_length - content_legth
        content = content + ('\0' * add).encode('utf-8')
    elif content_legth > key_length:
        add = 16 - (content_legth % 16)
        content = content + ('\0' * add).encode('utf-8')
    cipher_content = cryptor.encrypt(content)  # 加密
    print('加密1:', cipher_content)
    cipher_content_hex = b2a_hex(cipher_content)
    print('加密2:', cipher_content_hex)
    cipher_content_hex_de = cipher_content_hex.decode()
    print('密文:', cipher_content_hex_de)
    return cipher_content_hex_de


def decryp_str(en_content, key, mode, iv):
    cryptor = AES.new(key, mode, iv)
    content = a2b_hex(en_content)
    print('解密1:', content)
    content = cryptor.decrypt(content)
    print('解密2:', content)
    content = bytes.decode(content).rstrip('\0')
    print('明文:', content)
    return content


if __name__ == '__main__':
    # 加密内容
    content = input('输入加密内容:')
    # 密钥
    key = input('输入密钥:')
    key = key.encode('utf-8')  # 密钥需编码
    # 偏移量
    iv = input(r'输入偏移量(16位),少于16位将使用“\0”自动补齐:')
    print('原文:', content)
    content = content.encode('utf-8')  # 编码加密内容
    iv = iv.encode('utf-8')
    # 处理key和iv长度
    key = legth(key)
    iv = legth(iv)

    mode = AES.MODE_CBC  # 加密模式

    en_content = encryp_str(content, key, mode, iv)
    content = decryp_str(en_content, key, mode, iv)

效果:

Python实现AES加密解密_第1张图片

 

你可能感兴趣的:(爬虫实战)