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()