Python3 AES加密与解密

AES(Advanced Encryption Standard)是一种常用的对称加密算法,广泛应用于数据保护和安全传输领域。在本文中,我们将讨论如何使用Python3中的cryptography库实现AES加密与解密,并通过代码示例演示其用法。

1. AES算法概述

AES算法是一种分组密码算法,其中明文按块处理,块的大小固定为128位(16字节)。AES算法有三种密钥长度可选:128位、192位和256位,其中128位密钥版本被广泛使用。

AES加密过程涉及四个主要操作:SubBytes、ShiftRows、MixColumns和AddRoundKey。解密过程则是这些操作的逆序。

2. 安装cryptography库

在开始之前,我们需要先安装cryptography库。可以使用以下命令在终端中安装:

pip install cryptography

3. AES加密与解密示例代码

首先,我们需要导入cryptography库中的Fernet类。Fernet实现了对称加密算法,基于AES算法的实现。下面是一个简单的示例代码,演示如何使用AES对字符串进行加密和解密:

from cryptography.fernet import Fernet

# 生成随机密钥
key = Fernet.generate_key()

# 创建Fernet对象
cipher_suite = Fernet(key)

# 要加密的字符串
plaintext = "Hello, AES!"

# 加密字符串
ciphertext = cipher_suite.encrypt(plaintext.encode())

# 解密字符串
decrypted_text = cipher_suite.decrypt(ciphertext).decode()

# 输出结果
print("加密后的字符串:", ciphertext)
print("解密后的字符串:", decrypted_text)

以上代码中,我们首先使用Fernet.generate_key()生成一个随机的密钥。然后,创建一个Fernet对象,并使用生成的密钥进行初始化。接下来,我们将要加密的字符串转换为字节流,并通过调用encrypt()方法进行加密。最后,我们使用decrypt()方法对密文进行解密,并将解密后的结果转换为字符串。

请注意,AES加密算法是对称算法,加密和解密过程都使用相同的密钥。因此,我们需要保存好生成的密钥,以便在解密过程中使用。

4. 加密大文件的分块处理

在处理大文件时,为了避免内存溢出的问题,我们可以将文件分块加密,即每次只读取一部分文件进行加密。下面是一个示例代码,演示如何分块加密大文件:

from cryptography.fernet import Fernet

def encrypt_large_file(file_path, key):
    chunk_size = 64 * 1024  # 64KB

    cipher_suite = Fernet(key)

    with open(file_path, 'rb') as file:
        with open(file_path + '.enc', 'wb') as encrypted_file:
            while True:
                chunk = file.read(chunk_size)
                if not chunk:
                    break
                encrypted_chunk = cipher_suite.encrypt(chunk)
                encrypted_file.write(encrypted_chunk)

    print("文件加密完成!")

# 密钥
key = Fernet.generate_key()

# 文件路径
file_path = 'large_file.txt'

# 加密文件
encrypt_large_file(file_path, key)

以上代码中,我们首先定义了一个chunk_size变量,表示每次读取的文件块的大小。然后,创建了一个Fernet对象,并使用提供的密钥进行初始化。接下来,使用open()函数打开原始文件,并使用read()函数逐块读取文件内容。将每个读取的文件块使用encrypt()方法加密,并将加密后的块写入到新的加密文件中。

5. AES加密与解密的性能

使用cryptography库进行AES加密与解密操作的性能非常高。下面的代码展示了加密和解密的性能测试:

import time
from cryptography.fernet import Fernet

def measure_performance():
    key = Fernet.generate_key()
    cipher_suite = Fernet(key)

    plaintext = "Hello, AES!"

    # 加密性能测试
    start_time = time.time()
    for _ in range(10000):
        ciphertext = cipher_suite.encrypt(plaintext