在Python中实现加密和解密可以通过多种方式进行,包括对称加密算法、非对称加密算法、哈希算法等。其中,对称加密算法最常用的一种是AES(高级加密标准),非对称加密算法常用的是RSA,而哈希算法则包括MD5、SHA-1等。本文将详细介绍如何使用这些算法在Python中实现加密和解密。
一、对称加密算法(AES)
对称加密是一种使用相同密钥进行加密和解密的算法。AES(Advanced Encryption Standard)是对称加密算法的代表。Python中,可以使用pycryptodome
库来实现AES加密和解密。
安装pycryptodome库
首先,确保安装了pycryptodome
库:
pip install pycryptodome
AES加密和解密示例
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64
填充函数
def pad(data):
length = 16 - (len(data) % 16)
return data + chr(length) * length
去填充函数
def unpad(data):
return data[:-ord(data[len(data)-1:])]
AES加密
def aes_encrypt(key, data):
data = pad(data)
iv = get_random_bytes(16)
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv)
encrypted_data = cipher.encrypt(data.encode('utf-8'))
return base64.b64encode(iv + encrypted_data).decode('utf-8')
AES解密
def aes_decrypt(key, encrypted_data):
encrypted_data = base64.b64decode(encrypted_data)
iv = encrypted_data[:16]
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv)
data = cipher.decrypt(encrypted_data[16:])
return unpad(data.decode('utf-8'))
示例
key = 'thisisaverysecret'
data = 'Hello, World!'
encrypted = aes_encrypt(key, data)
print(f'Encrypted: {encrypted}')
decrypted = aes_decrypt(key, encrypted)
print(f'Decrypted: {decrypted}')
二、非对称加密算法(RSA)
非对称加密使用一对密钥——公钥和私钥。公钥用于加密,私钥用于解密。Python中可以使用pycryptodome
库来实现RSA加密和解密。
生成RSA密钥对
from Crypto.PublicKey import RSA
生成RSA密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
保存密钥到文件
with open('private.pem', 'wb') as f:
f.write(private_key)
with open('public.pem', 'wb') as f:
f.write(public_key)
RSA加密和解密示例
from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA
import base64
RSA加密
def rsa_encrypt(public_key, data):
key = RSA.import_key(public_key)
cipher = PKCS1_OAEP.new(key)
encrypted_data = cipher.encrypt(data.encode('utf-8'))
return base64.b64encode(encrypted_data).decode('utf-8')
RSA解密
def rsa_decrypt(private_key, encrypted_data):
key = RSA.import_key(private_key)
cipher = PKCS1_OAEP.new(key)
encrypted_data = base64.b64decode(encrypted_data)
data = cipher.decrypt(encrypted_data)
return data.decode('utf-8')
示例
public_key = open('public.pem', 'rb').read()
private_key = open('private.pem', 'rb').read()
data = 'Hello, World!'
encrypted = rsa_encrypt(public_key, data)
print(f'Encrypted: {encrypted}')
decrypted = rsa_decrypt(private_key, encrypted)
print(f'Decrypted: {decrypted}')
三、哈希算法
哈希算法将任意长度的数据映射为固定长度的哈希值,常用于数据完整性校验和密码存储。Python中可以使用hashlib
库来实现常见的哈希算法。
常见哈希算法示例
import hashlib
MD5哈希
def md5_hash(data):
md5 = hashlib.md5()
md5.update(data.encode('utf-8'))
return md5.hexdigest()
SHA-1哈希
def sha1_hash(data):
sha1 = hashlib.sha1()
sha1.update(data.encode('utf-8'))
return sha1.hexdigest()
SHA-256哈希
def sha256_hash(data):
sha256 = hashlib.sha256()
sha256.update(data.encode('utf-8'))
return sha256.hexdigest()
示例
data = 'Hello, World!'
print(f'MD5: {md5_hash(data)}')
print(f'SHA-1: {sha1_hash(data)}')
print(f'SHA-256: {sha256_hash(data)}')
四、其他加密算法和库
除了上述介绍的AES、RSA和哈希算法,Python中还有许多其他加密算法和库可供使用。例如,cryptography
库提供了更高层次的加密功能,支持包括对称加密、非对称加密、数字签名和密钥管理等。
安装cryptography库
pip install cryptography
使用cryptography库实现AES加密和解密
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
import os
AES加密
def aes_encrypt(key, data):
iv = os.urandom(16)
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
encryptor = cipher.encryptor()
padder = padding.PKCS7(algorithms.AES.block_size).padder()
padded_data = padder.update(data.encode('utf-8')) + padder.finalize()
encrypted_data = encryptor.update(padded_data) + encryptor.finalize()
return iv + encrypted_data
AES解密
def aes_decrypt(key, encrypted_data):
iv = encrypted_data[:16]
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
decryptor = cipher.decryptor()
decrypted_data = decryptor.update(encrypted_data[16:]) + decryptor.finalize()
unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
data = unpadder.update(decrypted_data) + unpadder.finalize()
return data.decode('utf-8')
示例
key = os.urandom(32)
data = 'Hello, World!'
encrypted = aes_encrypt(key, data)
print(f'Encrypted: {encrypted.hex()}')
decrypted = aes_decrypt(key, encrypted)
print(f'Decrypted: {decrypted}')
使用cryptography库实现RSA加密和解密
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
import base64
生成RSA密钥对
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public_key = private_key.public_key()
序列化密钥
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption()
)
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
RSA加密
def rsa_encrypt(public_key, data):
public_key = serialization.load_pem_public_key(public_key, backend=default_backend())
encrypted_data = public_key.encrypt(
data.encode('utf-8'),
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return base64.b64encode(encrypted_data).decode('utf-8')
RSA解密
def rsa_decrypt(private_key, encrypted_data):
private_key = serialization.load_pem_private_key(private_key, password=None, backend=default_backend())
encrypted_data = base64.b64decode(encrypted_data)
data = private_key.decrypt(
encrypted_data,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return data.decode('utf-8')
示例
data = 'Hello, World!'
encrypted = rsa_encrypt(public_pem, data)
print(f'Encrypted: {encrypted}')
decrypted = rsa_decrypt(private_pem, encrypted)
print(f'Decrypted: {decrypted}')
使用cryptography库实现数字签名
数字签名用于验证数据的完整性和真实性。常用的数字签名算法包括RSA和ECDSA。
RSA数字签名
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
签名
def sign_data(private_key, data):
private_key = serialization.load_pem_private_key(private_key, password=None, backend=default_backend())
signature = private_key.sign(
data.encode('utf-8'),
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
return base64.b64encode(signature).decode('utf-8')
验证签名
def verify_signature(public_key, data, signature):
public_key = serialization.load_pem_public_key(public_key, backend=default_backend())
signature = base64.b64decode(signature)
try:
public_key.verify(
signature,
data.encode('utf-8'),
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
return True
except:
return False
示例
data = 'Hello, World!'
signature = sign_data(private_pem, data)
print(f'Signature: {signature}')
is_valid = verify_signature(public_pem, data, signature)
print(f'Is valid: {is_valid}')
ECDSA数字签名
from cryptography.hazmat.primitives.asymmetric import ec
生成ECDSA密钥对
private_key = ec.generate_private_key(ec.SECP256R1(), default_backend())
public_key = private_key.public_key()
序列化密钥
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption()
)
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
签名
def sign_data(private_key, data):
private_key = serialization.load_pem_private_key(private_key, password=None, backend=default_backend())
signature = private_key.sign(
data.encode('utf-8'),
ec.ECDSA(hashes.SHA256())
)
return base64.b64encode(signature).decode('utf-8')
验证签名
def verify_signature(public_key, data, signature):
public_key = serialization.load_pem_public_key(public_key, backend=default_backend())
signature = base64.b64decode(signature)
try:
public_key.verify(
signature,
data.encode('utf-8'),
ec.ECDSA(hashes.SHA256())
)
return True
except:
return False
示例
data = 'Hello, World!'
signature = sign_data(private_pem, data)
print(f'Signature: {signature}')
is_valid = verify_signature(public_pem, data, signature)
print(f'Is valid: {is_valid}')
通过以上示例,我们可以看到Python中实现加密和解密的方法非常多样化,涵盖了对称加密、非对称加密、哈希算法以及数字签名等多种加密技术。根据具体的应用需求,可以选择合适的加密算法和库来保护数据的安全性。
相关问答FAQs:
如何在Python中选择合适的加密算法?
在Python中,有多种加密算法可供选择,包括对称加密和非对称加密。对称加密如AES(高级加密标准)适合处理大量数据,并且加密和解密使用相同的密钥,适合在信任环境中使用。非对称加密如RSA则适合在不安全的环境中传输密钥,因为它使用一对公钥和私钥进行加密和解密。选择合适的算法取决于您的具体需求,比如数据的敏感性、性能要求及实施复杂性。
如何使用Python库进行加密和解密操作?
Python提供了多个库用于实现加密和解密功能,最常用的库是cryptography
和PyCryptoDome
。使用cryptography
库,可以轻松实现加密和解密操作,只需导入相应的模块,生成密钥后即可对数据进行加密。例如,使用AES算法时,可以设置块大小、填充方式等参数,确保数据安全。而使用PyCryptoDome
则提供了类似的功能,用户可以根据自己的需求选择合适的库进行实现。
在Python中如何安全地存储和管理加密密钥?
加密密钥的安全存储至关重要。可以考虑使用环境变量或配置文件来存储密钥,同时确保这些文件的访问权限受到限制。此外,使用专门的密钥管理服务(如AWS KMS或Azure Key Vault)可以进一步增强密钥的安全性。这些服务不仅提供密钥生成和存储功能,还能提供访问控制和审计功能,确保密钥在使用过程中的安全性和合规性。