Python中的AES加密算法详解
在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:填充前数据块的长度。
相关文章