Python案例如何实现展示解密?

wen python案例 78

本文目录导读:

Python案例如何实现展示解密?

  1. 基础案例:凯撒密码加解密
  2. Base64编码解密
  3. AES对称加密
  4. RSA非对称加密
  5. 综合加解密工具类
  6. 图形界面加解密演示
  7. 安装依赖
  8. 使用说明

我来帮你实现一个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

使用说明

  1. 凯撒密码:最简单的替换密码,适合教学演示
  2. Base64:不是真正的加密,但常用于数据传输
  3. AES:对称加密,加密和解密使用相同密钥
  4. RSA:非对称加密,使用公钥加密、私钥解密
  5. Fernet:Python推荐的对称加密方式
  6. 图形界面:直观展示加解密过程

这些案例展示了Python中常见的加解密实现方式,你可以根据实际需求选择合适的方案。

抱歉,评论功能暂时关闭!