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

AES(Advanced Encryption Standard)是高级加密标准的缩写,它是对称加密算法中的一种。Python中有多个库能够实现AES加密和解密操作,其中`pycryptodome`是一个常用的选择。 ### 安装 pycryptodome 如果你还没有安装这个库的话,请先用pip安装: ```bash pip install pycryptodome ``` ### Python AES 加密解密示例代码 以下是一段简单的例子展示如何在Python中使用AES来进行字符串的加密与解密: #### 导入必要的模块 首先导入所需的类和方法: ```python from Crypto.Cipher import AES import base64 # 用于处理填充 from Crypto.Util.Padding import pad, unpad ``` #### 设置加解密使用的函数 接下来定义两个辅助函数用来执行实际的加密和解密逻辑: ```python def encrypt(plain_text, key): # 创建一个基于给定key的新AES Cipher实例 cipher = AES.new(key.encode('utf8'), AES.MODE_CBC) # 对明文进行PKCS7填充并编码为bytes类型后再加密 padded_plaintext = plain_text.encode('utf-8') ct_bytes = cipher.encrypt(pad(padded_plaintext, AES.block_size)) # 将IV(初始化向量)附加上去以便后续正确解码;这里我们简单地把它base64转成string连在一起返回。 iv_base64 = base64.b64encode(cipher.iv).decode('utf-8') ct_base64 = base64.b64encode(ct_bytes).decode('utf-8') return f"{iv_base64}:{ct_base64}" def decrypt(encryption_str, key): try: # 解析出IV部分以及真实的cipher text部分. iv_base64, ct_base64 = encryption_str.split(':') # 分别将两部分内容从base64恢复回来得到原本的数据形式。 iv = base64.b64decode(iv_base64) ct = base64.b64decode(ct_base64) # 使用相同的key创建一个新的AES Cipher对象,并传入之前保存下来的IV作为参数之一重新构造Cipher instance。 cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, iv=iv) decrypted_data = unpad(cipher.decrypt(ct), AES.block_size) return decrypted_data.decode('utf-8') except Exception as e: print(f"Error occurred during decryption - {str(e)}") raise ValueError("Failed to Decrypt Data") ``` 请注意,在上面的例子中,我们需要确保提供的`key`长度符合AES的要求——即必须为16字节、24字节或32字节长(对应于AES-128, AES-192 和 AES-256)。如果您的键不符合这些尺寸,则需要对其进行适当的截断或者扩展以满足需求。 #### 测试功能 现在我们可以尝试一下这两个新构建的方法了! ```python if __name__ == "__main__": secret_key = "thisisaverysecret" message_to_encrypt = "Hello World!" encrypted_message = encrypt(message_to_encrypt, secret_key) print("Encrypted:", encrypted_message) decrypted_message = decrypt(encrypted_message, secret_key) print("Decrypted:", decrypted_message) ``` 以上就是关于Python中的AES加密/解密的基本介绍啦~希望这对您有所帮助!如果您还有其他疑问或其他方面的需求,请随时告诉我哦。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值