python实现AES算法(CBC模式)
【代码】python实现AES算法(CBC模式)
·
用cmd更新pip
pip install --upgrade pip
用cmd安装cryptography库:
pip install cryptography
完整代码
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
import os
# 生成一个128位的密钥和初始化向量
key = os.urandom(16) # 生成一个16字节的随机密钥,即128位
iv = os.urandom(16) # 生成一个16字节的随机初始化向量
# 加密函数
def encrypt(plaintext):
padder = padding.PKCS7(algorithms.AES.block_size).padder() # 创建一个PKCS7填充器,块大小为AES的块大小
padded_data = padder.update(plaintext) + padder.finalize() # 对明文进行填充,以满足块大小要求
cipher = Cipher(algorithms.AES(key), modes.CBC(iv)) # 创建一个AES加密器,使用CBC模式
encryptor = cipher.encryptor() # 获取加密器的实例
ciphertext = encryptor.update(padded_data) + encryptor.finalize() # 加密填充后的明文
return ciphertext # 返回密文
# 解密函数
def decrypt(ciphertext):
cipher = Cipher(algorithms.AES(key), modes.CBC(iv)) # 创建一个AES解密器,使用CBC模式
decryptor = cipher.decryptor() # 获取解密器的实例
try:
padded_plaintext = decryptor.update(ciphertext) + decryptor.finalize() # 解密密文
unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder() # 创建一个PKCS7解填充器
plaintext = unpadder.update(padded_plaintext) + unpadder.finalize() # 去除填充
return plaintext # 返回解密后的明文
except ValueError as e: # 捕获解密过程中可能出现的错误
print(f"Decryption failed: {e}") # 打印错误信息
return None # 返回None表示解密失败
# 主程序循环
def main_loop():
while True: # 无限循环,直到用户选择退出
choice = input("请选择(1)加密 或 (2)解密 或 (0)退出程序: ").lower() # 获取用户输入
if choice == '1':
# 获取用户输入并加密
plaintext = input("请输入明文: ").encode('utf-8') # 将用户输入的明文编码为字节串
encrypted = encrypt(plaintext) # 调用加密函数
print(f"密文: {encrypted.hex()}") # 打印十六进制编码的密文
elif choice == '2':
# 获取用户输入并解密
user_input = input("请输入密文(十六进制编码文本): ") # 获取用户输入的密文
try:
ciphertext = bytes.fromhex(user_input) # 将十六进制编码文本转换为字节串
decrypted = decrypt(ciphertext) # 调用解密函数
if decrypted is not None: # 如果解密成功
print(f"明文: {decrypted.decode('utf-8')}") # 打印解密后的明文
except ValueError: # 捕获转换错误
print("输入无效,请确保输入正确的十六进制编码文本") # 提示用户输入错误
elif choice == '0':
print("退出程序") # 打印退出信息
break # 退出循环
else:
print("无效选择,请输入 1 进行加密,或 2 进行解密,或 0 退出程序") # 提示用户输入无效
if __name__ == "__main__":
main_loop() # 如果该脚本被直接运行,则调用主程序循环
更多推荐
所有评论(0)