Python实现AES加密解密详解
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 解码、创建解密对象、解密以及去除填充。最后分别调用加密和解密函数,并输出加密后的文本和解密后的文本。
科普内容
请注意,在实际应用中,密钥和初始化向量的管理非常重要,要确保其安全性,避免泄露。同时,代码中使用了pycryptodome
库,需要先安装该库才能运行(pip install pycryptodome
) 。
作者:yunAike