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