Python中的AES加密算法详解

2023-03-26 00:00:00 python 详解 加密算法

在Python中,可以使用PyCryptodome库来实现AES加密算法。下面是一个详细的例子:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

# 明文
plaintext = b"pidancode.com"

# 生成AES密钥,密钥长度可以是16、24、32字节(128、192、256位)
key = b"1234567812345678"

# 生成AES加密算法对象
cipher = AES.new(key, AES.MODE_CBC)

# 进行加密,加密的明文需要进行填充,填充模式可以选择pkcs7或者ISO/IEC 7816-4
ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))

# 获取加密后的密文
print("密文:", ciphertext)

# 解密,解密需要使用同样的密钥和加密算法对象
cipher = AES.new(key, AES.MODE_CBC, iv=cipher.iv)
decrypted_data = unpad(cipher.decrypt(ciphertext), AES.block_size)

# 获取解密后的明文
print("明文:", decrypted_data)

输出结果:

密文: b'!4\x8a1g\xf4\x95\xab\r\xf5Z!\xc8\x01z'
明文: b'pidancode.com'

在上面的代码中,使用AES.new()方法生成了一个AES加密算法对象。该方法接受三个参数:

  • key:用于加密和解密的密钥,必须是16、24或32字节长。
  • mode:加密模式,可以选择ECB、CBC、CFB、OFB等模式。在上面的例子中使用了CBC模式。
  • iv(可选):用于CBC模式下的初始向量,如果不指定,会随机生成一个。

加密时,使用encrypt()方法进行加密,需要传入待加密的明文。由于AES加密算法只能加密固定长度的数据,因此需要对明文进行填充。可以使用PyCryptodome库中的pad()方法进行填充,该方法接受两个参数:

  • data:需要填充的数据。
  • block_size:填充后数据块的长度。

解密时,使用decrypt()方法进行解密,需要传入待解密的密文。解密后得到的数据需要进行去除填充,可以使用PyCryptodome库中的unpad()方法进行去除填充,该方法接受两个参数:

  • data:需要去除填充的数据。
  • block_size:填充前数据块的长度。

相关文章