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加密和解密。
首先,我们定义了两个辅助函数pad和unpad来实现PKCS7填充和反填充操作。在AES-CBC模式中,明文数据的长度必须是块大小(16字节)的倍数,因此我们需要对数据进行填充。
然后,我们定义了encrypt和decrypt函数分别用于加密和解密操作。这两个函数接受一个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
可以看到,经过加密和解密后,明文数据得到了正确恢复。
