Python:如何使用AES进行加密与解密

引言

有时我们需要保持数据的秘密——例如密码、个人信息或私人消息。 AES(高级加密标准) 是一种非常流行的方法。

AES是一种将普通文本转换为不可读文本(加密),然后再转换回普通文本(解密)的方法,使用相同的秘密密钥(对称算法)。

当您需要保护敏感信息时——例如密码、财务数据或机密消息——加密是必不可少的。


安装

在开始之前:

  • 安装 Python 3.7 或更新版本
  • 通过运行以下命令安装 Python 包 cryptography
    pip install cryptography
    

理解 AES 加密

AES 是一种 对称密钥算法,这意味着加密和解密都使用相同的秘密密钥。

AES 支持的密钥大小:

  • 128 位
  • 192 位
  • 256 位(最强大,也是我们在本示例中使用的密钥)

操作模式 决定了算法的内部工作方式。常见的模式包括:

  • ECB(电子密码本): 简单但安全性较差。
  • CBC(密码块链): 比ECB更好,但需要额外注意完整性。
  • GCM(伽罗瓦/计数模式): 现代且安全。它同时提供加密和内置检查,以确保数据未被更改。在我们的代码中,我们将使用 GCM模式

Python代码示例

以下是一个完整的示例:

import random
import string
import base64
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

def encrypt_with_aes(input: str, enc_key: str, iv: str):
key = enc_key.encode()
nonce = iv.encode()
plaintext = input.encode()
aesgcm = AESGCM(key)
ciphertext = aesgcm.encrypt(nonce, plaintext, None)

# 将加密字节转换为可读的Base64字符串
 ciphertext_str = base64.b64encode(ciphertext).decode()
return ciphertext_str
def decrypt_with_aes(input: str, enc_key: str, iv: str):
    key = enc_key.encode()
    nonce = iv.encode()
    ciphertext = base64.b64decode(input)
    aesgcm = AESGCM(key)
    decrypted = aesgcm.decrypt(nonce, ciphertext, None)

这段代码定义了一个名为 `decrypt_with_aes` 的函数,该函数用于使用 AES 算法进行解密。函数接受三个参数:输入字符串 `input`、加密密钥 `enc_key` 和初始化向量 `iv`。在函数内部,首先将加密密钥和初始化向量编码为字节,然后对输入进行 Base64 解码。接着,使用 AESGCM 类创建一个 AES 加密对象,并调用其 `decrypt` 方法进行解密,最终返回解密后的结果。 
return decrypted.decode()

def generate_iv_string(length=16):
    # 为随机数创建一个随机字符串
    chars = string.ascii_letters + string.digits + "#$()*+,-.:;<=>?@[]_"
    return ''.join(random.choices(chars, k=length))

enc_key = "1Xt5YfM4ZNuFdwp3OfVkwkhhQLagWKtt"  # 32个字符的密钥

iv = generate_iv_string(12)  # 生成随机的 nonce/iv
input = "这是一条绝密信息"

ciphertext = encrypt_with_aes(input, enc_key, iv) # base64 编码的数据
print("密文:", ciphertext)

decrypted = decrypt_with_aes(ciphertext, enc_key, iv)
print("解密结果:", decrypted)
 代码工作原理:
  • encrypt_with_aes: 将消息加密,使其无法读取。
  • decrypt_with_aes: 将无法读取的消息解密为正常文本。
  • generate_iv_string: 每次生成一个新的随机nonce。

当你运行它时,你会看到:

密文: I1M8nE7HxHlmv7uKZPM/FsorN4hIiNhAm8fg2TavM75Dxp00zFrgRQem67E=
解密: 这是一个绝密消息

安全提示

    • 保持密钥安全: 不要直接在真实代码中写入密钥。将其存储在环境变量或安全的保管库中。
    • 每次使用不同的随机数: 切勿在相同密钥下重用相同的随机数。
    • 定期更换密钥: 对于长期项目,定期轮换(更改)您的密钥。

结论

AES-GCM是一种强大且值得信赖的数据保护方式。

通过几行Python代码,您可以隐藏一条消息,并使用相同的密钥将其取回。

要了解更多信息,请查看密码学库文档

更多