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


    目录
    《密码学》课程设计实验报告 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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150

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

  • 相关阅读:
    raylib部分源代码功能解读
    踩坑指南:入门OpenTenBase之部署篇
    【Spring Cloud】Eureka注册中心
    《软件工程》期末重点复习笔记
    游戏设计模式专栏(九):用装饰模式定制化游戏元素
    Authing 入选长城战略咨询《中国哪吒企业发展报告 2022》
    加工制造ERP是什么?适用的加工制造ERP软件有哪些?
    【C语言】可变参数列表详解
    十九、一起学习Lua 垃圾回收
    18.常见的loader以及作用的总结
  • 原文地址:https://blog.csdn.net/sheziqiong/article/details/126687747