Python 加密解密
1. 引言
在现代信息时代,数据的安全性变得越来越重要。加密是一种常见的保护数据安全性的手段。Python作为一门广泛应用于数据处理和安全领域的编程语言,也提供了丰富的加密解密库和功能。本文将详细介绍Python中常用的加密解密方法和库,并通过示例代码展示其用法和运行结果。
2. 加密算法
在加密领域,常用的加密算法包括对称加密和非对称加密两种。下面将分别介绍这两种加密算法的概念和Python库的使用。
2.1 对称加密
对称加密是指使用相同的密钥进行加密和解密的加密方式。常见的对称加密算法包括AES(Advanced Encryption Standard)、DES(Data Encryption Standard)和3DES等。Python中的cryptography
库提供了对称加密算法的支持。
示例代码:
from cryptography.fernet import Fernet
# 生成密钥
def generate_key():
key = Fernet.generate_key()
with open('key.key', 'wb') as file:
file.write(key)
# 加密
def encrypt(plain_text):
with open('key.key', 'rb') as file:
key = file.read()
cipher_suite = Fernet(key)
cipher_text = cipher_suite.encrypt(plain_text.encode())
return cipher_text
# 解密
def decrypt(cipher_text):
with open('key.key', 'rb') as file:
key = file.read()
cipher_suite = Fernet(key)
plain_text = cipher_suite.decrypt(cipher_text.encode())
return plain_text.decode()
运行结果:
generate_key() # 生成密钥
plain_text = 'Hello, world!'
cipher_text = encrypt(plain_text)
print(cipher_text) # b'...'
decrypted_text = decrypt(cipher_text)
print(decrypted_text) # 'Hello, world!'
2.2 非对称加密
非对称加密是指使用一对密钥进行加密和解密的加密方式。常见的非对称加密算法包括RSA(Rivest, Shamir, Adleman)和ECC(Elliptic Curve Cryptography)等。Python中的cryptography
库同样提供了非对称加密算法的支持。
示例代码:
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.backends import default_backend
# 生成密钥对
def generate_key_pair():
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public_key = private_key.public_key()
pem_private_key = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
)
pem_public_key = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
with open('private_key.pem', 'wb') as file:
file.write(pem_private_key)
with open('public_key.pem', 'wb') as file:
file.write(pem_public_key)
# 加密
def encrypt(plain_text):
with open('public_key.pem', 'rb') as file:
pem_public_key = file.read()
public_key = serialization.load_pem_public_key(
pem_public_key,
backend=default_backend()
)
cipher_text = public_key.encrypt(
plain_text.encode(),
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)
return cipher_text
# 解密
def decrypt(cipher_text):
with open('private_key.pem', 'rb') as file:
pem_private_key = file.read()
private_key = serialization.load_pem_private_key(
pem_private_key,
password=None,
backend=default_backend()
)
plain_text = private_key.decrypt(
cipher_text,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)
return plain_text.decode()
运行结果:
generate_key_pair() # 生成密钥对
plain_text = 'Hello, world!'
cipher_text = encrypt(plain_text)
print(cipher_text) # b'...'
decrypted_text = decrypt(cipher_text)
print(decrypted_text) # 'Hello, world!'
3. Hash算法
Hash算法是指将任意长度的数据通过运算映射到固定长度的值的算法。常见的Hash算法包括MD5(Message Digest Algorithm 5)、SHA-1(Secure Hash Algorithm 1)和SHA-256等。Python中的hashlib
库提供了各种Hash算法的支持。
示例代码:
import hashlib
# 计算MD5
def calc_md5(data):
md5 = hashlib.md5()
md5.update(data.encode())
return md5.hexdigest()
# 计算SHA-1
def calc_sha1(data):
sha1 = hashlib.sha1()
sha1.update(data.encode())
return sha1.hexdigest()
# 计算SHA-256
def calc_sha256(data):
sha256 = hashlib.sha256()
sha256.update(data.encode())
return sha256.hexdigest()
运行结果:
data = 'Hello, world!'
print(calc_md5(data)) # '65a8e27d8879283831b664bd8b7f0ad4'
print(calc_sha1(data)) # '0a4d55a8d778e5022fab701977c5d840bbc486d0'
print(calc_sha256(data)) # '309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7ca2cf9e9aa8e184949f'
4. Base64编码
Base64是一种常见的用于将二进制数据转换为文本数据的编码方式。Python中的base64
库提供了Base64编码的支持。
示例代码:
import base64
# 编码
def encode_base64(data):
encoded_data = base64.b64encode(data.encode())
return encoded_data.decode()
# 解码
def decode_base64(encoded_data):
decoded_data = base64.b64decode(encoded_data.encode())
return decoded_data.decode()
运行结果:
data = 'Hello, world!'
encoded_data = encode_base64(data)
print(encoded_data) # 'SGVsbG8sIHdvcmxkIQ=='
decoded_data = decode_base64(encoded_data)
print(decoded_data) # 'Hello, world!'
5. 解密常见文件格式
除了对数据进行加密和编码外,Python还提供了解密常见文件格式的库,如图片、音频和视频等。
5.1 解密图片(PNG)
示例代码:
from PIL import Image
# 解密PNG图片
def decrypt_png(image_file, output_file):
image = Image.open(image_file)
image_data = image.tobytes()
decrypted_data = decrypt(image_data)
decrypted_image = Image.frombytes(image.mode, image.size, decrypted_data)
decrypted_image.save(output_file)
5.2 解密音频(WAV)
示例代码:
import wave
# 解密WAV音频
def decrypt_wav(audio_file, output_file):
with wave.open(audio_file, 'rb') as audio:
params = audio.getparams()
frames = audio.readframes(audio.getnframes())
decrypted_frames = decrypt(frames)
with wave.open(output_file, 'wb') as decrypted_audio:
decrypted_audio.setparams(params)
decrypted_audio.writeframes(decrypted_frames)
5.3 解密视频(MP4)
示例代码:
import moviepy.editor as mp
# 解密MP4视频
def decrypt_mp4(video_file, output_file):
video = mp.VideoFileClip(video_file)
decrypted_video = video.fx(decrypt)
decrypted_video.write_videofile(output_file)
6. 小结
Python提供了丰富的加密解密库和功能,可以用于保护数据的安全性。本文介绍了常用的加密解密算法和库,并通过示例代码展示了它们的用法和运行结果。