import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
# 定义加密密钥,长度必须为16(AES-128)、24(AES-192)或32(AES-256)字节,这里是16字节示例
key = b'0123456789abcdef'
# 定义初始化向量(IV),长度必须和块大小一致,AES块大小为16字节
iv = b'0123456789abcdef'
# CBC(Cipher Block Chaining,密码块链接)模式,iv为偏移向量
# ECB(Electronic Codebook,电子密码本)是另一种模式,这里主要演示CBC
# 待加密的原始文本,使用encode()方法将字符串转换为字节串
plain_text = '这是原始数据'.encode()
def aes_encrypt(key, iv, plain_text):
# 创建AES加密对象,指定密钥、模式(CBC模式)和初始化向量
cipher = AES.new(key=key, mode=AES.MODE_CBC, iv=iv)
# 对原始数据进行填充,使其长度为AES块大小的整数倍
plain_text_pad = pad(plain_text, AES.block_size)
# 对填充后的数据进行加密
cipher_text = cipher.encrypt(plain_text_pad)
# 将加密后的数据进行Base64编码,并转换为字符串
cipher_text_b64 = base64.b64encode(cipher_text).decode()
return cipher_text_b64
def aes_decrypt(key, iv, cipher_text_b64):
# 将Base64编码的密文字符串解码为字节串
cipher_text = base64.b64decode(cipher_text_b64)
# 创建AES解密对象,指定密钥、模式(CBC模式)和初始化向量
cipher = AES.new(key=key, mode=AES.MODE_CBC, iv=iv)
# 对密文进行解密
plain_text_pad = cipher.decrypt(cipher_text)
# 去除填充的数据
plain_text = unpad(plain_text_pad, AES.block_size)
# 将字节串转换为字符串并返回
return plain_text.decode()
# 加密
encrypted_text = aes_encrypt(key, iv, plain_text)
print("加密后的文本:", encrypted_text)
# 解密
decrypted_text = aes_decrypt(key, iv, encrypted_text)
print("解密后的文本:", decrypted_text)
案例说明
在上述代码中,首先定义了加密密钥 key
和初始化向量 iv
,然后定义了待加密的原始文本 plain_text
。
aes_encrypt
函数实现了 AES 加密过程,包括创建加密对象、数据填充、加密以及 Base64 编码。aes_decrypt
函数实现了解密过程,包括 Base64 解码、创建解密对象、解密以及去除填充。
最后分别调用加密和解密函数,并输出加密后的文本和解密后的文本。
科普内容
- AES(Advanced Encryption Standard):高级加密标准,是一种对称加密算法,即加密和解密使用相同的密钥。AES 有三种密钥长度:128 位、192 位和 256 位,安全性较高,被广泛应用于数据加密场景,如网络通信、数据存储等。
- CBC(Cipher Block Chaining)模式:密码块链接模式,是 AES 加密的一种工作模式。在 CBC 模式中,每个明文块在加密前会与前一个密文块进行异或操作(第一个明文块与初始化向量 IV 进行异或),这样可以增加加密的随机性和安全性,防止相同的明文块生成相同的密文块。
- ECB(Electronic Codebook)模式:电子密码本模式,也是 AES 的一种工作模式。每个明文块独立加密,相同的明文块会生成相同的密文块,安全性相对较低,一般不推荐在实际应用中使用。
- 初始化向量(IV,Initialization Vector):在 CBC 模式等一些加密模式中使用,用于增加加密的随机性。每次加密时应使用不同的 IV,以避免相同明文加密后得到相同密文,从而提高加密的安全性 。
- 填充(Padding):由于 AES 加密要求数据长度必须是块大小(16 字节)的整数倍,当原始数据长度不满足时,需要进行填充。常见的填充方法有 PKCS#7 填充等。
请注意,在实际应用中,密钥和初始化向量的管理非常重要,要确保其安全性,避免泄露。同时,代码中使用了pycryptodome
库,需要先安装该库才能运行(pip install pycryptodome
) 。