python中的加密工具
已于 2025年10月28日 20:48 修改
访问次数:0
你说得对,之前的介绍可能过于简略了。让我们更详细地探讨 AES、RSA、SHA-256、盐值哈希 和 Fernet 每种方法的常见函数、参数以及应用场景。我会补充更多关于这些方法的用法、函数介绍和细节,以帮助你更深入理解。
1. AES(对称加密)
主要函数和方法:
- AES.new(key, mode, iv=None, counter=None, segment_size=None):创建一个 AES 加密器。 key:加密密钥,长度一般为 16、24 或 32 字节,分别对应 AES-128、AES-192、AES-256。 mode:加密模式,例如 AES.MODE_ECB(电子代码簿模式)、AES.MODE_CBC(密码分组链接模式)、AES.MODE_CFB(密码反馈模式)等。 iv:初始化向量(仅在某些模式下需要,如 CBC)。 counter:计数器,适用于 CTR 模式。 segment_size:用于 GCM 或其他模式时指定块大小。
- cipher.encrypt(data):对数据进行加密。
- cipher.decrypt(data):对数据进行解密。
- AES.block_size:AES 模式下的块大小(通常为 16 字节)。
完整示例:AES 加密和解密(CBC 模式)
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64
# 生成一个 128 位的随机密钥
key = get_random_bytes(16)
# 初始化 AES 加密器,使用 CBC 模式
cipher = AES.new(key, AES.MODE_CBC)
# 要加密的数据
data = "This is a secret message".encode('utf-8')
# 填充数据,使其长度为16的倍数
pad_length = 16 - (len(data) % 16)
data += bytes([pad_length]) * pad_length
# 加密
encrypted_data = cipher.encrypt(data)
# 输出加密后的数据(base64 编码)
print("Encrypted:", base64.b64encode(encrypted_data).decode())
# 解密
cipher_dec = AES.new(key, AES.MODE_CBC, cipher.iv)
decrypted_data = cipher_dec.decrypt(encrypted_data)
# 去除填充
decrypted_data = decrypted_data[:-decrypted_data[-1]].decode('utf-8')
print("Decrypted:", decrypted_data)
解释:
- AES.MODE_CBC:使用 CBC(密码分组链接模式)来加密数据。
- 填充:AES 的块大小为 16 字节,必须填充数据的长度,使其成为 16 的倍数。
- 解密时,需要使用相同的 iv(初始化向量)。
2. RSA(非对称加密)
主要函数和方法:
- rsa.generate_private_key(public_exponent, key_size):生成 RSA 私钥,public_exponent 通常为 65537,key_size 为密钥长度,通常为 2048 或 4096 位。
- private_key.public_key():从私钥中提取公钥。
- public_key.encrypt(data, padding):使用公钥加密数据,padding 通常使用 OAEP 填充模式(推荐)。
- private_key.decrypt(data, padding):使用私钥解密数据。
- public_key.encrypt(data, padding):使用公钥加密数据。
完整示例:RSA 加密和解密
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
# 生成 RSA 密钥对(私钥、公钥)
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
public_key = private_key.public_key()
# 加密数据
message = b"Encrypt this message"
ciphertext = public_key.encrypt(
message,
padding.OAEP(
algorithm=hashes.SHA256(),
label=None
)
)
# 解密数据
original_message = private_key.decrypt(
ciphertext,
padding.OAEP(
algorithm=hashes.SHA256(),
label=None
)
)
print("Original Message:", original_message.decode())
解释:
- RSA:加密数据时,使用公钥;解密时,使用私钥。
- OAEP 填充:一种加密填充方案,能提供较好的安全性。
- key_size=2048:推荐使用 2048 位以上的密钥。
3. SHA-256(哈希算法)
主要函数和方法:
- hashlib.sha256():创建一个 SHA-256 哈希对象。
- hash_object.update(data):更新哈希对象,data 必须是字节格式。
- hash_object.hexdigest():返回哈希值的十六进制字符串。
完整示例:SHA-256 哈希
import hashlib
# 创建 SHA-256 哈希对象
hash_object = hashlib.sha256()
# 更新哈希对象(必须是字节数据)
hash_object.update(b"This is a message")
# 获取哈希值
hashed_data = hash_object.hexdigest()
print("SHA-256 Hash:", hashed_data)
解释:
- hashlib.sha256():用于创建 SHA-256 哈希对象。
- update():可以多次调用,向哈希对象传入字节数据进行更新。
- hexdigest():获取最终的哈希值,并返回十六进制表示。
4. 盐值哈希(加盐)
主要函数和方法:
- os.urandom(size):生成随机盐值,size 指定盐值的字节长度。
- hashlib.sha256(data):对包含盐值和原始数据的组合进行哈希处理。
完整示例:盐值哈希
import hashlib
import os
# 生成一个16字节长度的随机盐值
salt = os.urandom(16)
# 原始密码
password = b"my_secure_password"
# 将盐与密码拼接
password_salt = salt + password
# 使用 SHA-256 生成哈希
hashed_password = hashlib.sha256(password_salt).hexdigest()
print("Hashed password with salt:", hashed_password)
解释:
- os.urandom(16):生成 16 字节的随机盐值,确保每次生成的哈希值都不同。
- 盐值作用:将盐值与原密码拼接后进行哈希,防止了不同用户使用相同密码时产生相同的哈希值。
5. Fernet(对称加密)
主要函数和方法:
- Fernet.generate_key():生成密钥。
- Fernet(key):使用密钥初始化 Fernet 加密器。
- cipher.encrypt(data):加密数据,返回加密后的数据。
- cipher.decrypt(data):解密数据,返回解密后的数据。
完整示例:Fernet 加密和解密
from cryptography.fernet import Fernet
# 生成密钥
key = Fernet.generate_key()
# 创建 Fernet 加密器
cipher = Fernet(key)
# 加密数据
message = b"Confidential message"
encrypted_message = cipher.encrypt(message)
print("Encrypted:", encrypted_message)
# 解密数据
decrypted_message = cipher.decrypt(encrypted_message)
print("Decrypted:", decrypted_message.decode())
解释:
- Fernet:基于 AES 加密和 HMAC,保证消息的机密性和完整性。生成的密钥必须保密。
- generate_key():用于生成一个新的密钥,确保每个加密操作都能使用唯一的密钥。
- encrypt() 和 decrypt():分别用于加密和解密数据。
总结:
| 加密方式 | 主要函数 | 说明 |
|---|---|---|
| AES | AES.new(),cipher.encrypt(),cipher.decrypt() | 对称加密,使用相同的密钥加解密。 |
| RSA | rsa.generate_private_key(),public_key.encrypt(),private_key.decrypt() | 非对称加密,公钥加密,私钥解密。 |
| SHA-256 | hashlib.sha256(),hash_object.update(),hash_object.hexdigest() | 哈希算法,单向不可解密。 |
| 盐值哈希 | os.urandom(),hashlib.sha256() | 哈希加盐,增强密码存储安全性 |
评论(0)