基于通信加密的文字文件传输系统(Python)

发布于:2022-12-30 ⋅ 阅读:(159) ⋅ 点赞:(0)

目录
《密码学》课程设计实验报告 1
实验序号:08 实验项目名称:密码学综合实验 1
程序使用说明: 4
以下为单机情况进行半双工通信为例: 进入到可执行文件的文件夹, 4
六、SM4 15
其他 18
一、 运行速度 18
二、 程序占用空间 18
三、 安全功能 19
四、 算法扩展性 19
一、 实验目的及要求
教学目的:
(1)熟悉适合密码应用的领域及应用方法;
(2)掌握一种密码应用技术。实验要求:
(1)掌握对称算法的实现;
(2)掌握非对称算法的实现;
(3)实现下列密码学的一种(或多种)应用:
计算机文件加密
通信加密
认证
签名
密钥管理
(4)掌握加密、签名、认证、密钥管理等技术的综合运用。
二、实验设备(环境)及要求
Windows 10 64 位
Python 3.6.1
GUI 库:wxpython
三、实验内容与步骤
作品名称:基于通信加密的文字文件传输系统
简介:本软件是基于通信加密的文字文件传输软件,实现了接收端、发送端二合一,可在网络内(1)实现全双工通信(2)。通信加密使用公开加密算法协商单次会话使用的分组密码密钥,使用分组密码进行加密通信,可自定义公开加密算法的相关参数,并设计了一套简单的通信协议及包格式,以校验发送的加密数据的完整性。
注:(1) 可在两台主机都具有公网 ip 时,或是在同一无 NAT 端口映射的局域网时进行全双工通信。 本文转载自http://www.biyezuopin.vip/onews.asp?id=15591
(2)若发送端和接收端在同一台主机上工作时,由于端口的唯一性,应用程序与端口绑定,故只能实现半双工通信。

# coding=utf-8

import wx
import wx.xrc
import communication
import threading

# 消息队列
msg_queue = []


# GUI 界面
class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"加密传输系统 by xxg", pos=wx.DefaultPosition,
                          size=wx.Size(440, 600), style=wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.SYSTEM_MENU|wx.TAB_TRAVERSAL, name=u"Main")
        self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
        self.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT))
        self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))

        bSizer1 = wx.BoxSizer(wx.VERTICAL)

# 监听 & 连接按钮
        fgSizer0 = wx.FlexGridSizer(0, 2, 0, 0)
        fgSizer0.SetFlexibleDirection(wx.BOTH)
        fgSizer0.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
        self.m_button_listen = wx.Button(self, wx.ID_ANY, u"监听", wx.DefaultPosition, wx.DefaultSize, 0)
        fgSizer0.Add(self.m_button_listen, 0, wx.ALL, 5)
        self.m_button_connect = wx.Button(self, wx.ID_ANY, u"连接", wx.DefaultPosition, wx.DefaultSize, 0)
        fgSizer0.Add(self.m_button_connect, 0, wx.ALL, 5)

        bSizer1.Add(fgSizer0, 0, wx.EXPAND, 5)
# 消息框
        fgSizer5 = wx.FlexGridSizer(0, 1, 0, 0)
        fgSizer5.SetFlexibleDirection(wx.BOTH)
        fgSizer5.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)

        self.area_text = wx.TextCtrl(self, -1, u'连接尚未建立,按以下键继续操作\n监听: 等待连接\n连接: 连接目标主机', size=(400, 380),
                                     style=(wx.TE_MULTILINE | wx.TE_DONTWRAP))
        self.area_text.SetInsertionPoint(0)

        fgSizer5.Add(self.area_text, 0, wx.ALL, 5)
        bSizer1.Add(fgSizer5, 0, wx.EXPAND, 5)

# File Select
        fgSizer2 = wx.FlexGridSizer(0, 2, 0, 0)
        fgSizer2.SetFlexibleDirection(wx.BOTH)
        fgSizer2.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)

        self.m_staticText3 = wx.StaticText(self, wx.ID_ANY, u"发送文件", wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_staticText3.Wrap(-1)
        self.m_staticText3.SetFont(wx.Font(wx.NORMAL_FONT.GetPointSize(), 70, 90, 90, False, wx.EmptyString))

        fgSizer2.Add(self.m_staticText3, 0, wx.ALL, 5)

        self.m_filePicker1 = wx.FilePickerCtrl(self, wx.ID_ANY, wx.EmptyString, u"Select a file", u"*.*",
                                               wx.DefaultPosition, wx.Size(300, -1),
                                               wx.FLP_DEFAULT_STYLE | wx.FLP_SMALL)
        fgSizer2.Add(self.m_filePicker1, 0, wx.ALL, 5)

        bSizer1.Add(fgSizer2, 0, wx.EXPAND, 5)

# 文本输入框及发送按钮
        fgSizer4 = wx.FlexGridSizer(0, 2, 0, 0)
        fgSizer4.SetFlexibleDirection(wx.BOTH)
        fgSizer4.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)

        self.senf_text = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.Point(-1, -1), wx.Size(300, 80), style=(wx.TE_MULTILINE | wx.TE_DONTWRAP))
        self.input_str = self.senf_text.GetValue()

        fgSizer4.Add(self.senf_text, 0, wx.ALL, 5)

        self.m_button_send = wx.Button(self, wx.ID_ANY, u"发送", wx.DefaultPosition, wx.DefaultSize, 0)
        fgSizer4.Add(self.m_button_send, 0, wx.ALL, 5)

        bSizer1.Add(fgSizer4, 0, wx.EXPAND, 5)
# End

        self.SetSizer(bSizer1)
        self.Layout()

        self.Centre(wx.BOTH)

        self.m_button_listen.Bind(wx.EVT_BUTTON, self.m_button_listen_OnButtonClick)
        self.m_button_connect.Bind(wx.EVT_BUTTON, self.m_button_connect_OnButtonClick)
        self.m_button_send.Bind(wx.EVT_BUTTON, self.m_button_send_OnButtonClick)

    def __del__(self):
        pass

    # 监听按钮事件,开启监听线程
    def m_button_listen_OnButtonClick(self, event):
        listen_thread = threading.Thread(target=self.listen_thread)
        listen_thread.start()

    # 连接按钮事件,开启连接线程
    def m_button_connect_OnButtonClick(self, event):
        connect_thread = threading.Thread(target=self.connect_thread)
        connect_thread.start()
        pass

    # 发送按钮事件,发送文字或文件
    def m_button_send_OnButtonClick(self, event):
        try:
            text = self.senf_text.GetValue()
            if text != '':
                msg_queue.append("Sending text: %s\n" % text)
                self.connect.send_string(text)
                self.senf_text.Clear()

            f_path = self.m_filePicker1.GetPath()
            if f_path != '':
                msg_queue.append("Sending file: %s\n" % f_path)
                self.connect.send_file(f_path)
                self.m_filePicker1.Refresh()
        except Exception as e:
            print("Send Fail")
            print(e)
            msg_queue.append("\n发送失败,连接尚未建立或已经断开,请重新建立连接\n")

    # 监听线程
    def listen_thread(self):
        self.listen = communication.Communication(mode='LISTEN', msg_queue=msg_queue)
        self.listen.listen_manager()

    # 连接线程
    def connect_thread(self):
        self.connect = communication.Communication(mode='CONNECT', msg_queue=msg_queue)

    # 显示结果线程
    def disp_text(self):
        self.area_text.Clear()
        msg_queue.append("连接尚未建立,按以下键继续操作\n监听: 等待连接\n连接: 连接目标主机\n")

        while True:
            if len(msg_queue) != 0:
                self.area_text.AppendText(msg_queue.pop(0))

    # 开启显示结果线程
    def disp_text_begin(self):
        disp_text = threading.Thread(target=self.disp_text)
        disp_text.start()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame(None)
    frame.Show(True)
    frame.disp_text_begin()
    app.MainLoop()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看