diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 2e347e3..500c1d5 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,7 +4,7 @@
-
+
@@ -30,6 +30,7 @@
+
{
"history": [
@@ -68,11 +69,12 @@
"Python.receiver.executor": "Run",
"Python.sender.executor": "Run",
"Python.server.executor": "Run",
+ "Python.ui.executor": "Run",
"Python.utils.executor": "Run",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.git.unshallow": "true",
"git-widget-placeholder": "annn",
- "last_opened_file_path": "D:/college/大三/应用密码学课设",
+ "last_opened_file_path": "C:/Users/Asus/Desktop/烽台校园实习/交接资料/实验室仿真台攻击脚本/实验室仿真台攻击脚本/仿真台攻击脚本11.22",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
@@ -81,8 +83,8 @@
"vue.rearranger.settings.migration": "true"
}
}
-
-
+
+
@@ -96,7 +98,7 @@
-
+
@@ -105,7 +107,7 @@
-
+
@@ -119,7 +121,7 @@
-
+
@@ -128,7 +130,7 @@
-
+
@@ -142,7 +144,7 @@
-
+
@@ -151,7 +153,7 @@
-
+
@@ -165,7 +167,7 @@
-
+
@@ -199,11 +201,11 @@
+
+
-
-
@@ -229,7 +231,10 @@
-
+
+
+
+
@@ -271,7 +276,23 @@
1734489312302
-
+
+
+ 1734489392435
+
+
+
+ 1734489392435
+
+
+
+ 1734782367798
+
+
+
+ 1734782367798
+
+
@@ -305,14 +326,16 @@
-
+
+
-
+
+
diff --git a/private.pem b/private.pem
deleted file mode 100644
index 138f6d8..0000000
--- a/private.pem
+++ /dev/null
@@ -1,9 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIBPQIBAAJBAKJRCS1LQm9GAgZejtry1W0wMANwQQau01PeezV6DY7TOG+G08cv
-boN4UaS5comyK7QKIr6WVi/4o+Pm5UcZsQ0CAwEAAQJAY0EgVnUd48Mwe8qYmmRB
-hCoiQggDi12eVjvGpbXDPWF3yHX+mVbqrJY3oi9Ub9iJW8Lqw97DcBp/74fvvxd/
-9QIjAPQTvQk8a7yTItR/Tyl/UStL0e+3KY6wuhWeEzACMV7JFcMCHwCqPtsRTG8e
-ZBgat2p3ih2tkkO/XNshxOLibUZiIO8CIwCpH2A2HSK96OoSeiB9LZYtvPy78Jug
-Hr7iKcU719kjx4wHAh8AqULQ/wPlPmv54yYUfkEdfKJ9JNcnLw3XHZPTdGCVAiJa
-N3aZQDyYTX+/8V0E7vxaUlYJMgwXtXs+94qi25rsIWQr
------END RSA PRIVATE KEY-----
diff --git a/public.pem b/public.pem
deleted file mode 100644
index 9cb3710..0000000
--- a/public.pem
+++ /dev/null
@@ -1,4 +0,0 @@
------BEGIN RSA PUBLIC KEY-----
-MEgCQQCiUQktS0JvRgIGXo7a8tVtMDADcEEGrtNT3ns1eg2O0zhvhtPHL26DeFGk
-uXKJsiu0CiK+llYv+KPj5uVHGbENAgMBAAE=
------END RSA PUBLIC KEY-----
diff --git a/receiver_private.pem b/receiver_private.pem
index 8aefb56..298c902 100644
--- a/receiver_private.pem
+++ b/receiver_private.pem
@@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEAqcmg7dhBByM+WbVKZ+5wfEO2eCRD0OhyjGZaVMEkfkv9jWon
-H8nY9HT8lziJByNbs6ZbZnFkPoUxBi52938Bq2pTAJ3Z5l06qLfd6ryVdAO0IxZG
-3+RZ2mfL4Jwg7jTrJ5ygRaiV/K8FjSzAkrEYHGwKc7mfxkyqmWbdq4f4ETBsiZ6d
-SCoMqtDiSmeZ6/zjryAOGhqHDX/Zh3BqqOcapT1jm6Kf4Pc/BcpsHYQzblve3Frj
-DWnQCzHGBN4AfQ8qmrQAXCaFa8xzAnzgvznVk411Bu2Rmsp1EWrBC5uY8x0IYF7b
-MDi2/Bl5XAbPU32fCo141v2r/NeSV20p2k7DxwIDAQABAoIBAEY3qFHlBxOsHCue
-gayU3DlQCaULHm7FyyXMaJw3ml+PDsfOuGp5oDuNLC9gBq+IjHKyIIev6my+yaUM
-T1AQ2wBowvX00jpmoQ1IqULchhSKOZPvMRWECzL7jUIRX78T7JKfwFq+m3T6bxnR
-Ab1I9zc96V6tzGmGqGEzvQYk/88fYglzuU8xz2uXiKj4/T8XnejuQj7hGKzPdKyf
-zrDTbZ1vrFQutmgWMUMakAyFvn81KFzezhld53VgLSh+6k7tH8bxgzJ/b6BD74Wg
-Na6XkM0xu2OamduNZczpBq2S3QkDPtihSfcZYUQ+z/VGLKsM2LkIGZ7VMgz447y4
-TquhrDUCgYEAvqXVpYm9jPRWPGOMNA00wT3nbA3LjiddVtDFte2JN+JxiYRHvNtj
-ALVZKifpKAmZSm6wVXWZ39LrGv4L0lNvKsGb3JM3bExJ4FmZsqpMzWCOkKM+Q9Cc
-7tVwr2f13Gm2OYAn3dHpXo2knDtsDi2rwDmyAyOUEgANPFCj2v0NViMCgYEA4/05
-Mawn0QTGsIhKHjtWWh3zOQUhroEPR7jqO19/BAE9srJEPuI6rOC4e6exiv/s81zR
-qVsUQMHNfVaV7ka4yCmrUJHPYmvWNA9bZYSXH6AxMmd48SO9gAQx1nMR6YQrxZGW
-GkzihxcGi7e8slXeJsCQ2tY0truJy2R4CYglTA0CgYEArhP8Zb/EnW0JRPDctzaL
-whtFMYvTHwTgnIHa1ciEL8wLQbbQTijAWIg+V1jD83P4TVeOmSndi9sqI6Zuouje
-K9tG9vxRcgiiuED4L4SCxlDxPC5ij0dv1EB+ORujClRYOF7FiCzAez64XJOBkdyv
-48CKw4T8EgeMDlPPmgjP4aMCgYAs3atAtDFNt9Pl75wuYNz4dQZlRTZAohNAuQoX
-Tw6u2hOrM9usSFblqH+FjhWpVf3qUmzMGClfKQRoUv7EWlSIx3J4M4mNQ81uh0sk
-KjiXN64WzjgFtFPZennYSuLOgn0eryzL1i+KCCT4n9rZeX5zP9gByL+s6jEOvqHE
-tm8ojQKBgQCxId3KRqYnmgFbefuuuqbonILGPNPZhkgRNT2l3J85v2IoofhZLsGB
-AfS4mrkQ7UwzoaWdMOsfUYX/H0IWBs6blE/WL2OLPIfDWnmCTNftvbQouKhdMCwd
-rOCwEZ3bH99O8rzvcdEmsgx+AK1g/3PpVFs4P8QGa0qNAIoORWKBbw==
+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
-----END RSA PRIVATE KEY-----
\ No newline at end of file
diff --git a/receiver_public.pem b/receiver_public.pem
index 83df805..f64f106 100644
--- a/receiver_public.pem
+++ b/receiver_public.pem
@@ -1,9 +1,9 @@
-----BEGIN PUBLIC KEY-----
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqcmg7dhBByM+WbVKZ+5w
-fEO2eCRD0OhyjGZaVMEkfkv9jWonH8nY9HT8lziJByNbs6ZbZnFkPoUxBi52938B
-q2pTAJ3Z5l06qLfd6ryVdAO0IxZG3+RZ2mfL4Jwg7jTrJ5ygRaiV/K8FjSzAkrEY
-HGwKc7mfxkyqmWbdq4f4ETBsiZ6dSCoMqtDiSmeZ6/zjryAOGhqHDX/Zh3BqqOca
-pT1jm6Kf4Pc/BcpsHYQzblve3FrjDWnQCzHGBN4AfQ8qmrQAXCaFa8xzAnzgvznV
-k411Bu2Rmsp1EWrBC5uY8x0IYF7bMDi2/Bl5XAbPU32fCo141v2r/NeSV20p2k7D
-xwIDAQAB
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl4H8ztB6F4Smewf7OUpg
+QCm2iJST9+X+odvFV9lkA0cU3HLbPV7O/dAC0jjVFOM1fNcklHxkJppH7kjJ31/X
+hfPvZpaShja6PZS2ffCPbQRBAcjhPs0gwzZMKe3qwUBZCAducFtgi7BXvNhRNfOM
+ufPnuzHx//XJReQzJ6Z747jticAT7nLIF2EM+vl24jsM1Gnm1LyMPV3gyxUamfqy
+LxyHr2WnqRNZs89CK4TnzrU9Jdw2Y5BzED9J7mDqOIOyDnzJ+9q/EN/ciOpnS04Y
+kZH26nuVN90RHnp37MY9z7p3o8j8KRXir524o+UhBVgVkCS7zTmVorZsql7I2cx9
+GQIDAQAB
-----END PUBLIC KEY-----
\ No newline at end of file
diff --git a/sender_private.pem b/sender_private.pem
index ab6233c..a7c8208 100644
--- a/sender_private.pem
+++ b/sender_private.pem
@@ -1,27 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
-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
+MIIEowIBAAKCAQEAvLvy6YiIfvCz+aF9gEkfHREjPPSPG6jI/hhSTiGG9i71rnCC
+rHFB3Nk0A1i/tv3rVn70O9W+jKroUNDNQaAoI3ytv0r+3iw/qS8S53ErGEV5Ms7Y
+MmgAkFTmQArWx9muD9JvLo1XFXvQFSIgtthdyqXC+SKnWsK9b/gXN7qVv/r5sR5A
+Mn067QZhVEc4cNfF0UEBS2+8UgxhH3PqbZzfV+cBfKBQ8JNWVgDmRSvKowQOQE87
+tMwTgsQKONuYFHtnzQ1Lo8gyF0f8PVRfln+hoj9WjvvCg0C9wBbfIuAxCgkqKEbb
+48KgUiNmT1YFJ3PaPAYjjchqQeFCT5CPqdC6jQIDAQABAoIBAARvgCKlXFxPX+DH
+IprUjuH4OHjmfLWh7MA8AopKM20g2IP2HBFrpxoqTDEVRt+6wxXQNKvkNsQ5yAm4
+2voRai5NGrdbFdrFEayc4tQu+VwVVecwAUqFFsOi8H5b7YUv/SYkRCg2z++SbnVG
+Bg5bXTALJpfncF4deKXVPFvJYMzspttNyE9lvoDL090/QsfITnOC6MNwu5EWwoH5
+zTJxxraiJpPnUiSA2S7w+EQV+WHgUCY2MFt4c1jIKfjtqB7g9wYQouKkVS3RzZoq
+iXqTS+avj5iMT+VRgxV5+WoRr+JXJf9aRmPtKqlFO4Jxt49EGLooBmw3Eq3WCItL
+gMUx1oECgYEAvy0anPGVLkDA1kRNsUCchKCnh2J4vWf8IZbS8OWSQm03Pyx26cUv
+AgeVtYXNqcCBP5f4X1Jg+jtwm7GwVQfD8CoMIoS0RKrEldFF9K03XfxI7mD+fjBo
+xAmcT1XHniMsAh6gT0bc7OAzt8wT7/e/cRSe/uBnSxROvCl7bezfgZECgYEA/Lre
+NlsyDEAuKgB/FRGnJDBWIlCULHLRfOi4dJi452JvgvWvxEa1DG2Hptbt+EfWuHIs
+Lf6hz+ePQLG022S8/KetkLwSqhohsOOhXoAuxf8j8ETUrMPHsaKUTjJNB6/0L1dt
+rKOxc0oQRuN0uH/f/uwbcKaOZ2Iypm5k+btTqz0CgYEArsSE98TCJC5+G2MFw2zV
+qUlU3adfyYcuL2a6IA8+zgsZ3l6/tqXUe36DlhZkFTMu9PvwyvN8REXig/LEyHb4
+4K0Put6mDcAvRuaxlSRk4T6pTYLOJH4MyGogw0Yf3qk4qhdlZhPaE5JCtVuTPmS2
+VqILV+W9iB1gfRNPCwborIECgYAIO7I3hRsJSSH33lJFhnCyfhygO43IMOlgL1iq
++7qyVwOY+ZYDR+ZoBD1yEvhnqTd2hMmpqeztj/abve5NY2fAt1mxKF9XSUilsZS1
+NmnPq3MpRaTECBC+WbSJI5xczr+etzNsd1y1i8kh9hD8XbYXYOu37MUg2xMZVulV
+NWQRZQKBgASHsgW9kFtsNKqfvjFwCQlFF1o21kRcoUgmF1tFkhBxzWGUpeNJCLN5
+Y9eG9AY0FzlSG7ZfcMlSo0vZ5UZIciAx1Cyo943ArJSwo09DK7kVh2Hzo6lHMStg
+LP6/py2oIITlOfIx/x336EpKlDIpijKbhhxEHEfTnCra24f9hytP
-----END RSA PRIVATE KEY-----
\ No newline at end of file
diff --git a/sender_public.pem b/sender_public.pem
index cc78e47..8a57f66 100644
--- a/sender_public.pem
+++ b/sender_public.pem
@@ -1,9 +1,9 @@
-----BEGIN PUBLIC KEY-----
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtSEr81A8CZPXnscsBgOk
-bQcrn3/JELmndlf2Ysez8sKCgz04pB4XII0o7f2FZkDNLOu5fqs5OmSQd1IZRekn
-Gudcw5QJTUEvTKLzbkJNSJzhf0+kH5yv9M3nS9DB6+VftjP0Hl84148UqpMUq71B
-ygfwCFiUwgvUBbCfpO+gqth+oa38wmcHQUeHYFhsJRGn2wI3URNuZIcJjOax2SCV
-AqRM/vyAS0Q7MSiGNV0BkVudhWkG0/uaIvCRxO/F3TB9F4x5mHgCt1/cnHeQ4H8a
-7EsEmypSQ2oGB+oRt4GsvfFHwZGz8uOUxQkGGCqNt1cLcHoOHuFJBHCSWwN/kF1f
-eQIDAQAB
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvLvy6YiIfvCz+aF9gEkf
+HREjPPSPG6jI/hhSTiGG9i71rnCCrHFB3Nk0A1i/tv3rVn70O9W+jKroUNDNQaAo
+I3ytv0r+3iw/qS8S53ErGEV5Ms7YMmgAkFTmQArWx9muD9JvLo1XFXvQFSIgtthd
+yqXC+SKnWsK9b/gXN7qVv/r5sR5AMn067QZhVEc4cNfF0UEBS2+8UgxhH3PqbZzf
+V+cBfKBQ8JNWVgDmRSvKowQOQE87tMwTgsQKONuYFHtnzQ1Lo8gyF0f8PVRfln+h
+oj9WjvvCg0C9wBbfIuAxCgkqKEbb48KgUiNmT1YFJ3PaPAYjjchqQeFCT5CPqdC6
+jQIDAQAB
-----END PUBLIC KEY-----
\ No newline at end of file
diff --git a/ui.py b/ui.py
new file mode 100644
index 0000000..ef4e8c6
--- /dev/null
+++ b/ui.py
@@ -0,0 +1,158 @@
+import tkinter as tk
+from tkinter import filedialog, messagebox
+import os
+import subprocess
+from sender import send_file
+from receiver import receive_file
+from utils import load_key
+
+class FileTransferApp:
+ def __init__(self, root):
+ self.root = root
+ self.root.title("文件传输系统")
+ self.root.geometry("800x900") # 增大窗口尺寸
+ self.root.resizable(False, False) # 禁止调整窗口大小
+
+ # 设置窗口背景色
+ self.root.configure(bg="#f5f5f5")
+
+ # 加载密钥
+ self.sender_private_key = load_key('sender_private.pem')
+ self.receiver_public_key = load_key('receiver_public.pem')
+ self.receiver_private_key = load_key('receiver_private.pem')
+ self.sender_public_key = load_key('sender_public.pem')
+
+ # 创建UI
+ self.create_main_frame()
+
+ def create_main_frame(self):
+ # 主界面,选择发送方或接收方
+ self.main_frame = tk.Frame(self.root, bg="#f5f5f5")
+ self.main_frame.pack(fill="both", expand=True)
+
+ self.selection_var = tk.StringVar(value="sender") # 默认选择发送方
+
+ # 选择发送方或接收方
+ tk.Radiobutton(self.main_frame, text="我是发送方", variable=self.selection_var, value="sender", font=("Arial", 16),
+ bg="#f5f5f5", command=self.switch_mode).pack(pady=20)
+ tk.Radiobutton(self.main_frame, text="我是接收方", variable=self.selection_var, value="receiver", font=("Arial", 16),
+ bg="#f5f5f5", command=self.switch_mode).pack(pady=20)
+
+ # 按钮:生成密钥
+ tk.Button(self.main_frame, text="生成公钥/私钥对", font=("Arial", 16), bg="#8BC34A", fg="white", relief="raised", bd=4,
+ width=20, height=2, command=self.generate_keys).pack(pady=20)
+
+ # 初始显示发送方界面
+ self.sender_frame = None
+ self.receiver_frame = None
+ self.switch_mode()
+
+ def switch_mode(self):
+ """切换模式(发送方或接收方)"""
+ # 清空当前界面
+ if self.sender_frame:
+ self.sender_frame.destroy()
+ if self.receiver_frame:
+ self.receiver_frame.destroy()
+
+ mode = self.selection_var.get()
+
+ if mode == "sender":
+ self.create_sender_frame()
+ elif mode == "receiver":
+ self.create_receiver_frame()
+
+ def create_sender_frame(self):
+ """创建发送方界面"""
+ self.sender_frame = tk.LabelFrame(self.main_frame, text="发送文件", padx=30, pady=30, bg="#ffffff", font=("Arial", 14, "bold"))
+ self.sender_frame.pack(padx=30, pady=30, fill="both", expand=True)
+
+ self.filename_var = tk.StringVar()
+
+ # 选择文件按钮
+ tk.Button(self.sender_frame, text="选择文件", command=self.select_file,
+ font=("Arial", 16), bg="#4CAF50", fg="white", relief="raised", bd=4,
+ width=20, height=3, activebackground="#45a049").pack(padx=10, pady=15)
+
+ # 显示文件路径
+ self.filename_entry = tk.Entry(self.sender_frame, textvariable=self.filename_var, width=60, font=("Arial", 14), state='readonly', bd=3)
+ self.filename_entry.pack(padx=10, pady=15)
+
+ # 输入接收方 IP 和端口
+ tk.Label(self.sender_frame, text="接收方 IP:", font=("Arial", 14), bg="#ffffff").pack(pady=10)
+ self.receiver_ip_entry = tk.Entry(self.sender_frame, width=40, font=("Arial", 14), bd=3)
+ self.receiver_ip_entry.pack(pady=10)
+ self.receiver_ip_entry.insert(0, "192.168.1.1")
+
+ tk.Label(self.sender_frame, text="接收方端口:", font=("Arial", 14), bg="#ffffff").pack(pady=10)
+ self.receiver_port_entry = tk.Entry(self.sender_frame, width=40, font=("Arial", 14), bd=3)
+ self.receiver_port_entry.pack(pady=10)
+ self.receiver_port_entry.insert(0, "12345")
+
+ # 增大按钮大小
+ send_button = tk.Button(self.sender_frame, text="发送文件", command=self.send_file,
+ font=("Arial", 16), bg="#007BFF", fg="white", relief="raised", bd=4,
+ width=25, height=3, activebackground="#0056b3")
+ send_button.pack(padx=10, pady=30, fill='x')
+
+ def create_receiver_frame(self):
+ """创建接收方界面"""
+ self.receiver_frame = tk.LabelFrame(self.main_frame, text="接收文件", padx=30, pady=30, bg="#ffffff", font=("Arial", 14, "bold"))
+ self.receiver_frame.pack(padx=30, pady=30, fill="both", expand=True)
+
+ # 接收文件按钮
+ receive_button = tk.Button(self.receiver_frame, text="接收文件", command=self.receive_file,
+ font=("Arial", 16), bg="#FF5722", fg="white", relief="raised", bd=4,
+ width=25, height=3, activebackground="#e64a19")
+ receive_button.pack(padx=10, pady=30, fill='x')
+
+ def generate_keys(self):
+ """调用 generate_key.py 生成公钥和私钥"""
+ try:
+ # 使用 subprocess 调用 generate_key.py 生成密钥对
+ subprocess.run(["python", "generate_key.py"], check=True)
+ messagebox.showinfo("成功", "公钥和私钥已生成!")
+ except subprocess.CalledProcessError as e:
+ messagebox.showerror("错误", f"密钥生成失败:{e}")
+
+ def select_file(self):
+ """选择文件"""
+ file_path = filedialog.askopenfilename()
+ if file_path:
+ self.filename_var.set(file_path)
+
+ def send_file(self):
+ """发送文件"""
+ filename = self.filename_var.get()
+ if not filename or not os.path.exists(filename):
+ messagebox.showerror("错误", "请选择有效的文件!")
+ return
+
+ receiver_ip = self.receiver_ip_entry.get()
+ receiver_port = self.receiver_port_entry.get()
+
+ if not receiver_ip or not receiver_port:
+ messagebox.showerror("错误", "请填写接收方的 IP 和端口!")
+ return
+
+ try:
+ # 调用 sender.py 中的 send_file 函数
+ send_file(filename, receiver_ip, int(receiver_port), self.receiver_public_key, self.sender_private_key)
+ messagebox.showinfo("成功", "文件发送成功!")
+ except Exception as e:
+ messagebox.showerror("错误", f"文件发送失败:{e}")
+
+ def receive_file(self):
+ """接收文件"""
+ try:
+ port = 12345
+ # 调用 receiver.py 中的 receive_file 函数
+ receive_file(port, self.receiver_private_key, self.sender_public_key)
+ messagebox.showinfo("成功", "文件接收成功!")
+ except Exception as e:
+ messagebox.showerror("错误", f"文件接收失败:{e}")
+
+if __name__ == "__main__":
+ root = tk.Tk()
+ app = FileTransferApp(root)
+ root.mainloop()