本文目录导读:

我来帮你实现一个Python加密解密展示案例,包含多种常见的加密方法。
基础案例:凯撒密码加解密
def caesar_cipher(text, shift, mode='encrypt'):
"""
凯撒密码加解密
mode: 'encrypt' 加密,'decrypt' 解密
"""
result = ""
if mode == 'decrypt':
shift = -shift
for char in text:
if char.isalpha():
# 判断大小写
start = ord('A') if char.isupper() else ord('a')
# 移位并取模
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
# 使用示例
text = "Hello, World!"
shift = 3
encrypted = caesar_cipher(text, shift, 'encrypt')
decrypted = caesar_cipher(encrypted, shift, 'decrypt')
print(f"原文: {text}")
print(f"加密后: {encrypted}")
print(f"解密后: {decrypted}")
Base64编码解密
import base64
def base64_demo(text):
"""Base64编码解码演示"""
# 编码(加密)
encoded = base64.b64encode(text.encode()).decode()
# 解码(解密)
decoded = base64.b64decode(encoded).decode()
print(f"原文: {text}")
print(f"Base64编码: {encoded}")
print(f"Base64解码: {decoded}")
return encoded, decoded
# 使用示例
base64_demo("Python加密演示")
AES对称加密
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
def aes_encrypt_decrypt(text, key):
"""AES加密解密演示"""
# 确保key为16字节
if len(key) < 16:
key = key.ljust(16)[:16]
else:
key = key[:16]
key = key.encode()
# 加密
cipher = AES.new(key, AES.MODE_ECB)
padded_text = pad(text.encode(), AES.block_size)
encrypted = cipher.encrypt(padded_text)
encrypted_base64 = base64.b64encode(encrypted).decode()
# 解密
cipher = AES.new(key, AES.MODE_ECB)
decrypted = unpad(cipher.decrypt(encrypted), AES.block_size)
decrypted_text = decrypted.decode()
print(f"原文: {text}")
print(f"密钥: {key.decode()}")
print(f"加密结果(Base64): {encrypted_base64}")
print(f"解密结果: {decrypted_text}")
return encrypted_base64, decrypted_text
# 使用示例(需要安装pycryptodome: pip install pycryptodome)
aes_encrypt_decrypt("Python AES加密解密示例", "mysecretkey12345")
RSA非对称加密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64
def rsa_encrypt_decrypt(text):
"""RSA加密解密演示"""
# 生成RSA密钥对
key = RSA.generate(2048)
private_key = key
public_key = key.publickey()
# 加密(使用公钥)
cipher_rsa = PKCS1_OAEP.new(public_key)
encrypted = cipher_rsa.encrypt(text.encode())
encrypted_base64 = base64.b64encode(encrypted).decode()
# 解密(使用私钥)
cipher_rsa = PKCS1_OAEP.new(private_key)
decrypted = cipher_rsa.decrypt(encrypted)
decrypted_text = decrypted.decode()
print(f"原文: {text}")
print(f"公钥: {public_key.export_key().decode()[:50]}...")
print(f"私钥: {private_key.export_key().decode()[:50]}...")
print(f"加密结果(Base64): {encrypted_base64}")
print(f"解密结果: {decrypted_text}")
return encrypted_base64, decrypted_text
# 使用示例
rsa_encrypt_decrypt("RSA非对称加密演示")
综合加解密工具类
import hashlib
import base64
from cryptography.fernet import Fernet
class CryptoUtils:
"""综合加解密工具类"""
@staticmethod
def md5_hash(text):
"""MD5哈希(不可逆)"""
return hashlib.md5(text.encode()).hexdigest()
@staticmethod
def sha256_hash(text):
"""SHA256哈希(不可逆)"""
return hashlib.sha256(text.encode()).hexdigest()
@staticmethod
def fernet_encrypt_decrypt(text, key=None):
"""Fernet对称加密"""
if not key:
key = Fernet.generate_key()
f = Fernet(key)
# 加密
encrypted = f.encrypt(text.encode())
# 解密
decrypted = f.decrypt(encrypted).decode()
print(f"原文: {text}")
print(f"密钥: {key.decode()}")
print(f"加密结果: {encrypted.decode()}")
print(f"解密结果: {decrypted}")
return encrypted.decode(), decrypted
# 使用示例
print("=== MD5哈希 ===")
print(CryptoUtils.md5_hash("Python编程"))
print("\n=== SHA256哈希 ===")
print(CryptoUtils.sha256_hash("Python编程"))
print("\n=== Fernet加密 ===")
CryptoUtils.fernet_encrypt_decrypt("Fernet加密解密示例")
图形界面加解密演示
import tkinter as tk
from tkinter import ttk, messagebox
import base64
from cryptography.fernet import Fernet
class CryptoApp:
def __init__(self, root):
self.root = root
self.root.title("加解密演示工具")
self.root.geometry("600x400")
# 生成密钥
self.key = Fernet.generate_key()
self.cipher = Fernet(self.key)
self.setup_ui()
def setup_ui(self):
# 输入区域
tk.Label(self.root, text="输入文本:", font=("Arial", 12)).pack(pady=10)
self.input_text = tk.Text(self.root, height=5, width=50)
self.input_text.pack(pady=5)
# 按钮区域
btn_frame = tk.Frame(self.root)
btn_frame.pack(pady=10)
tk.Button(btn_frame, text="🔐 加密",
command=self.encrypt_text,
bg="lightblue", width=15).pack(side=tk.LEFT, padx=5)
tk.Button(btn_frame, text="🔓 解密",
command=self.decrypt_text,
bg="lightgreen", width=15).pack(side=tk.LEFT, padx=5)
tk.Button(btn_frame, text="🔑 生成新密钥",
command=self.generate_new_key,
bg="lightyellow", width=15).pack(side=tk.LEFT, padx=5)
# 结果显示
tk.Label(self.root, text="结果:", font=("Arial", 12)).pack(pady=10)
self.result_text = tk.Text(self.root, height=5, width=50)
self.result_text.pack(pady=5)
# 密钥显示
tk.Label(self.root, text=f"当前密钥: {self.key.decode()[:30]}...",
font=("Arial", 8)).pack(pady=5)
def encrypt_text(self):
text = self.input_text.get("1.0", tk.END).strip()
if not text:
messagebox.showwarning("警告", "请输入要加密的文本")
return
try:
encrypted = self.cipher.encrypt(text.encode())
self.result_text.delete("1.0", tk.END)
self.result_text.insert("1.0", encrypted.decode())
messagebox.showinfo("成功", "加密完成!")
except Exception as e:
messagebox.showerror("错误", f"加密失败: {str(e)}")
def decrypt_text(self):
text = self.result_text.get("1.0", tk.END).strip()
if not text:
messagebox.showwarning("警告", "没有可解密的内容")
return
try:
decrypted = self.cipher.decrypt(text.encode())
self.result_text.delete("1.0", tk.END)
self.result_text.insert("1.0", decrypted.decode())
messagebox.showinfo("成功", "解密完成!")
except Exception as e:
messagebox.showerror("错误", f"解密失败: {str(e)}")
def generate_new_key(self):
self.key = Fernet.generate_key()
self.cipher = Fernet(self.key)
# 更新密钥显示
for widget in self.root.winfo_children():
if isinstance(widget, tk.Label) and "当前密钥" in widget.cget("text"):
widget.config(text=f"当前密钥: {self.key.decode()[:30]}...")
break
messagebox.showinfo("成功", "新密钥已生成!")
# 运行图形界面
if __name__ == "__main__":
root = tk.Tk()
app = CryptoApp(root)
root.mainloop()
安装依赖
# 安装必要的库 pip install cryptography pycryptodome
使用说明
- 凯撒密码:最简单的替换密码,适合教学演示
- Base64:不是真正的加密,但常用于数据传输
- AES:对称加密,加密和解密使用相同密钥
- RSA:非对称加密,使用公钥加密、私钥解密
- Fernet:Python推荐的对称加密方式
- 图形界面:直观展示加解密过程
这些案例展示了Python中常见的加解密实现方式,你可以根据实际需求选择合适的方案。