Python AES 128位加密实现教程
1. 操作流程概述
在本教程中,我将教会你如何使用Python实现AES 128位加密算法。为了帮助你更好地理解整个过程,我将使用表格展示每个步骤。以下是整个操作流程的概述:
步骤 | 描述 |
---|---|
1 | 导入AES库 |
2 | 生成随机的16字节密钥 |
3 | 创建AES对象 |
4 | 使用密钥初始化AES对象 |
5 | 将明文填充为16字节的倍数 |
6 | 加密明文 |
7 | 解密密文 |
8 | 去除解密后的明文填充 |
接下来,我会逐步解释每个步骤需要做什么,并提供相应的代码示例。
2. 代码示例
步骤1:导入AES库
首先,我们需要导入AES库。AES库是Python标准库中的一个扩展库,用于实现AES加密算法。以下是导入AES库的代码:
from Crypto.Cipher import AES
步骤2:生成随机的16字节密钥
在AES加密中,使用128位密钥(16字节)进行加密和解密。我们可以使用Python的secrets
模块来生成一个随机的16字节密钥。以下是生成密钥的代码:
import secrets
key = secrets.token_bytes(16)
步骤3:创建AES对象
接下来,我们需要创建一个AES对象,用于执行加密和解密操作。以下是创建AES对象的代码:
cipher = AES.new(key, AES.MODE_ECB)
步骤4:使用密钥初始化AES对象
在步骤3中创建的AES对象需要使用生成的密钥进行初始化。以下是使用密钥初始化AES对象的代码:
cipher = AES.new(key, AES.MODE_ECB)
步骤5:填充明文为16字节的倍数
在进行AES加密时,明文的长度必须是16字节的倍数。如果明文的长度不是16字节的倍数,我们需要进行填充。在本教程中,我们将使用PKCS7填充方案。以下是填充明文的代码:
def pad(plaintext):
pad_len = 16 - (len(plaintext) % 16)
padding = bytes([pad_len] * pad_len)
return plaintext + padding
plaintext = "Hello, world!"
padded_plaintext = pad(plaintext.encode())
步骤6:加密明文
现在,我们可以使用AES对象对填充后的明文进行加密了。以下是加密明文的代码:
ciphertext = cipher.encrypt(padded_plaintext)
步骤7:解密密文
如果我们想要解密密文,只需要使用AES对象对密文进行解密操作。以下是解密密文的代码:
decrypted_plaintext = cipher.decrypt(ciphertext)
步骤8:去除解密后的明文填充
最后一步是去除解密后的明文填充。我们可以通过检查明文的最后一个字节来获取填充长度,并根据填充长度截取明文。以下是去除解密后的明文填充的代码:
def unpad(plaintext):
pad_len = plaintext[-1]
return plaintext[:-pad_len]
unpadded_plaintext = unpad(decrypted_plaintext)
3. 完整示例代码
from Crypto.Cipher import AES
import secrets
def pad(plaintext):
pad_len = 16 - (len(plaintext) % 16)
padding = bytes([pad_len] * pad_len)
return plaintext + padding
def unpad(plaintext):
pad_len = plaintext[-1]
return plaintext[:-pad_len]
def aes_encrypt(plaintext):
key = secrets.token_bytes(16)
cipher = AES.new(key, AES.MODE_ECB)
padded_plaintext = pad(plaintext.encode())
ciphertext = cipher.encrypt(padded_plaintext)
return ciphertext, key
def aes_decrypt(ciphertext, key):
cipher = AES.new(key, AES