📅  最后修改于: 2023-12-03 15:08:45.434000             🧑  作者: Mango
在现代社会中,数据泄露和隐私被窃取的事件屡见不鲜,因此在数据传输和储存过程中加密数据已经成为一个必要的处理方式。Python 作为一种高级编程语言,拥有许多加密算法和库供开发者使用,本文将介绍如何在 Python 中加密文本。
对称加密(Symmetric-key encryption)使用同一个密钥来进行加密和解密,因此加密速度较快。常见的对称加密算法有 DES、3DES、AES 等,其中 AES 是一种目前被广泛运用的对称加密算法。Python 中的 PyCryptodome 库提供了对称加密的实现方法。
from Cryptodome.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
# 加密数据
def encrypt_data(data, key):
cipher = AES.new(key.encode("utf-8"), AES.MODE_CBC)
ciphertext = cipher.encrypt(pad(data.encode("utf-8"), AES.block_size))
return base64.b64encode(ciphertext).decode("utf-8")
# 解密数据
def decrypt_data(iv, data, key):
cipher = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv=base64.b64decode(iv.encode("utf-8")))
return unpad(cipher.decrypt(base64.b64decode(data.encode("utf-8"))), AES.block_size).decode("utf-8")
# 加密数据
data = "Hello World!"
key = "mySecretKey2021"
encrypted_data = encrypt_data(data, key)
print("加密后的数据:", encrypted_data)
# 解密数据
iv = encrypted_data[:24] # iv 需要在加密数据中提取
decrypted_data = decrypt_data(iv, encrypted_data[24:], key)
print("解密后的数据:", decrypted_data)
以上代码展示了如何使用 PyCryptodome 对数据进行 AES 加密和解密。其中,pad
和 unpad
方法实现了对数据进行块填充和去填充的过程。在加密和解密数据时,需要提供同样的密钥。
非对称加密(Asymmetric-key encryption)使用一对不同的密钥,其中一个称为公钥,另一个称为私钥。公钥可以自由传播,私钥仅保持在密钥拥有者手中,公钥用于加密,私钥用于解密。常见的非对称加密算法有 RSA 和 ECC,Python 中的 Cryptography 库提供了非对称加密算法的实现方法。
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
import base64
# 生成密钥对
private_key = rsa.generate_private_key(
public_exponent=65537, key_size=2048
)
public_key = private_key.public_key()
# 保存公钥和私钥
pem_private = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
)
pem_public = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
# 使用公钥加密数据
def encrypt_data(data, public_key):
ciphertext = public_key.encrypt(
data.encode("utf-8"),
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return base64.b64encode(ciphertext).decode("utf-8")
# 使用私钥解密数据
def decrypt_data(data, private_key):
ciphertext = base64.b64decode(data.encode("utf-8"))
plaintext = private_key.decrypt(
ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return plaintext.decode("utf-8")
# 加密数据
data = "Hello World!"
encrypted_data = encrypt_data(data, public_key)
print("加密后的数据:", encrypted_data)
# 解密数据
decrypted_data = decrypt_data(encrypted_data, private_key)
print("解密后的数据:", decrypted_data)
以上代码展示了如何使用 Cryptography 库生成密钥对,并对数据进行加密和解密。其中,public_bytes
和 private_bytes
方法用于将密钥保存为 PEM 格式,并在需要时进行恢复。在加密和解密数据时,需要提供公钥或私钥以及对应的加密或解密方法。
哈希加密(Hash encryption)对数据进行不可逆加密,常见的哈希算法有 MD5、SHA-1、SHA-256 等。Python 中的 hashlib 库提供了哈希算法的实现方法。
import hashlib
# 对数据进行哈希
def hash_data(data, algorithm):
h = hashlib.new(algorithm)
h.update(data.encode("utf-8"))
return h.hexdigest()
# 对文件进行哈希
def hash_file(filename, algorithm):
h = hashlib.new(algorithm)
with open(filename, "rb") as f:
while True:
chunk = f.read(65536)
if not chunk:
break
h.update(chunk)
return h.hexdigest()
# 对数据进行 SHA-256 哈希
data = "Hello World!"
hash_algorithm = "sha256"
hashed_data = hash_data(data, hash_algorithm)
print(hash_algorithm, "哈希结果:", hashed_data)
# 对文件进行 SHA-1 哈希
filename = "example.txt"
hash_algorithm = "sha1"
hashed_file = hash_file(filename, hash_algorithm)
print(hash_algorithm, "哈希结果:", hashed_file)
以上代码展示了如何使用 hashlib 库对数据进行哈希。new
方法接受一个算法类型参数,返回一个与算法相应的哈希对象。update
方法用于更新哈希结果,最后通过 hexdigest
方法返回哈希值的字符串表示。需要注意的是,哈希结果是不可逆的,因此无法通过哈希值恢复原数据。
本文介绍了使用 Python 中的 PyCryptodome、Cryptography 和 hashlib 库对数据进行对称加密、非对称加密和哈希加密的方法。在实际应用中,需要根据数据传输和存储的情况,选择适合的加密算法和加密方式。