引言
有时我们需要保持数据的秘密——例如密码、个人信息或私人消息。 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代码,您可以隐藏一条消息,并使用相同的密钥将其取回。
要了解更多信息,请查看密码学库文档。