一个生成随机密码的python小工具


import tkinter as tk
from tkinter import messagebox
import string
import secrets

def generate_ssh_key(random_length, use_upper, use_lower, use_digits, use_special):
    """生成模拟SSH密钥格式的随机字符串"""
    chars = []
    if use_upper:
        chars.extend(string.ascii_uppercase)
    if use_lower:
        chars.extend(string.ascii_lowercase)
    if use_digits:
        chars.extend(string.digits)
    if use_special:
        chars.extend('+/=@_.-')
    if not chars:
        raise ValueError("必须至少选择一种字符类型")
    
    random_part = ''.join(secrets.choice(chars) for _ in range(random_length))
    return f"{random_part}"

class SSHKeyGeneratorApp:
    def __init__(self, master):
        self.master = master
        master.title("密钥生成器")
        master.geometry("400x320")

        # 密钥长度设置
        self.length_frame = tk.Frame(master)
        self.length_frame.pack(pady=5)
        tk.Label(self.length_frame, text="密钥主体长度:").pack(side=tk.LEFT)
        self.length_entry = tk.Entry(self.length_frame, width=10)
        self.length_entry.pack(side=tk.LEFT)
        self.length_entry.insert(0, "64")

        # 字符类型选择
        self.char_frame = tk.LabelFrame(master, text="字符类型")
        self.char_frame.pack(pady=5, padx=10, fill=tk.X)
        
        self.upper_var = tk.BooleanVar(value=True)
        self.lower_var = tk.BooleanVar(value=True)
        self.digits_var = tk.BooleanVar(value=True)
        self.special_var = tk.BooleanVar(value=True)
        
        tk.Checkbutton(self.char_frame, text="大写字母 (A-Z)", variable=self.upper_var).pack(anchor='w')
        tk.Checkbutton(self.char_frame, text="小写字母 (a-z)", variable=self.lower_var).pack(anchor='w')
        tk.Checkbutton(self.char_frame, text="数字 (0-9)", variable=self.digits_var).pack(anchor='w')
        tk.Checkbutton(self.char_frame, text="特殊字符 (+/=@_.-)", variable=self.special_var).pack(anchor='w')

        # 按钮区域
        self.button_frame = tk.Frame(master)
        self.button_frame.pack(pady=10)
        tk.Button(self.button_frame, text="生成密钥", command=self.generate).pack(side=tk.LEFT, padx=5)
        tk.Button(self.button_frame, text="复制密钥", command=self.copy_key).pack(side=tk.LEFT, padx=5)

        # 结果显示
        self.result_frame = tk.LabelFrame(master, text="生成的密钥")
        self.result_frame.pack(pady=5, padx=10, fill=tk.BOTH, expand=True)
        self.result_text = tk.Text(self.result_frame, height=4, wrap=tk.WORD)
        self.result_text.pack(fill=tk.BOTH, expand=True)

    def generate(self):
        """处理生成操作"""
        try:
            length = int(self.length_entry.get())
            if length <= 0:
                raise ValueError
        except ValueError:
            messagebox.showerror("错误", "请输入有效的正整数长度")
            return

        try:
            ssh_key = generate_ssh_key(
                random_length=length,
                use_upper=self.upper_var.get(),
                use_lower=self.lower_var.get(),
                use_digits=self.digits_var.get(),
                use_special=self.special_var.get()
            )
        except ValueError as e:
            messagebox.showerror("错误", str(e))
            return

        self.result_text.delete(1.0, tk.END)
        self.result_text.insert(tk.END, ssh_key)

    def copy_key(self):
        """复制密钥到剪贴板"""
        key = self.result_text.get(1.0, tk.END).strip()
        if key:
            self.master.clipboard_clear()
            self.master.clipboard_append(key)
            messagebox.showinfo("成功", "密钥已复制到剪贴板")
        else:
            messagebox.showwarning("警告", "没有可复制的密钥")

if __name__ == "__main__":
    root = tk.Tk()
    app = SSHKeyGeneratorApp(root)
    root.mainloop()