Python 加密解密

Python 加密解密

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提供了丰富的加密解密库和功能,可以用于保护数据的安全性。本文介绍了常用的加密解密算法和库,并通过示例代码展示了它们的用法和运行结果。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程