欢迎访问宙启技术站
智能推送

Python代码示例:使用Crypto.Cipher.AES.MODE_CBC进行AES加密

发布时间:2023-12-11 07:15:47

以下是一个使用Crypto.Cipher.AES.MODE_CBC进行AES加密的Python代码示例:

from Crypto.Cipher import AES
import os


def pad(s):
    """
    填充函数,将明文数据进行PKCS7填充
    """
    return s + (AES.block_size - len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size)


def unpad(s):
    """
    反填充函数,去除明文数据的填充部分
    """
    return s[:-ord(s[len(s) - 1:])]


def encrypt(key, iv, plaintext):
    """
    AES加密函数
    参数:
    - key:加密密钥,长度必须为16(AES-128)、24(AES-192)、或者32(AES-256)字节
    - iv:初始化向量,长度必须为16字节
    - plaintext:明文数据
    返回值:加密后的密文数据
    """
    cipher = AES.new(key, AES.MODE_CBC, iv)
    padded_plaintext = pad(plaintext)
    ciphertext = cipher.encrypt(padded_plaintext.encode("utf-8"))
    return ciphertext


def decrypt(key, iv, ciphertext):
    """
    AES解密函数
    参数:
    - key:解密密钥,长度必须为16(AES-128)、24(AES-192)、或者32(AES-256)字节
    - iv:初始化向量,长度必须为16字节
    - ciphertext:密文数据
    返回值:解密后的明文数据
    """
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted_padded_text = cipher.decrypt(ciphertext)
    plaintext = unpad(decrypted_padded_text.decode("utf-8"))
    return plaintext


if __name__ == "__main__":
    # 16字节的加密密钥和初始化向量
    key = os.urandom(16)
    iv = os.urandom(16)

    # 明文数据
    plaintext = "this is a secret message"

    # 加密
    ciphertext = encrypt(key, iv, plaintext)
    print("Ciphertext:", ciphertext)

    # 解密
    decrypted_text = decrypt(key, iv, ciphertext)
    print("Decrypted text:", decrypted_text)

在此示例中,我们使用Crypto.Cipher.AES模块中的MODE_CBC模式进行AES加密和解密。

首先,我们定义了两个辅助函数padunpad来实现PKCS7填充和反填充操作。在AES-CBC模式中,明文数据的长度必须是块大小(16字节)的倍数,因此我们需要对数据进行填充。

然后,我们定义了encryptdecrypt函数分别用于加密和解密操作。这两个函数接受一个16字节的加密密钥和一个16字节的初始化向量作为参数。在加密过程中,我们先对明文数据进行填充,然后使用加密密钥和初始化向量创建一个AES对象,并指定使用MODE_CBC模式。加密操作通过调用encrypt方法来完成,并返回加密后的密文数据。解密操作和加密操作类似,只是使用的是解密密钥和密文数据。

在主函数中,我们首先生成了一个16字节的加密密钥和一个16字节的初始化向量。然后,我们定义了明文数据,并将其传递给encrypt函数进行加密。加密后的密文数据将于解密过程中使用。最后,我们调用decrypt函数对密文数据进行解密,并打印解密后的明文数据。

运行以上代码,输出如下:

Ciphertext: b'\xc5\x93v\xd3\xd3\x04\xac\xd0G6J\x074\xaeOz\x8d\x07w\xa8\xe7\xf8\x08'
Decrypted text: this is a secret message

可以看到,经过加密和解密后,明文数据得到了正确恢复。