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 解码、创建解密对象、解密以及去除填充。
    最后分别调用加密和解密函数,并输出加密后的文本和解密后的文本。

科普内容

  • 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) 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值