DH加密通信python实现

概况介绍

本次实验实现了DH原理的双机通信。DH_Client和DH_Server的main部分与call_DH部分大同小异,主要是用于本地调试显示,可以忽略。

原理介绍

p,q为公有信息。
1.Alice 选择一个范围在[1, p-1]的随机数,为rand_a
2.Alice 计算cal_a = q^rand_a mod p
3.Bob选择一个范围在[1, p-1]的随机数,为rand_b = 6
4.Bob计算cal_b = q^rand_b mod p
5.Alice和Bob交换cal_a和cal_b
6.Alice计算共享密钥S = cal_b ^rand_a mod p
7.Bob计算共享密钥S = cal_a ^rand_b mod p

RSA_sign

# -*- coding:utf-8 -*-
import rsa
import binascii
import os
#快速模幂运算,模重复平方
def powmod(b,n,m):
	ans=1
	while n > 0:
		if (n & 1) !=0:
			ans = (ans*b)%m
		b = (b*b) % m
		n >>= 1
	return ans
def bytes_to_int(s):
    return int.from_bytes(s,byteorder='big',signed=False)
#rsa类
class rsa_crypto():
	#生成RSA密钥对同时返回公钥
	def generate_key(self,dir):
		list=rsa.newkeys(1024)
		list=str(list)
		with open(dir, 'w') as f:
			f.write(list)
		list=list.split(',')
		n=str(list[0][11:])
		pubkey = str(list[1][:-1])
		return n,pubkey
	#私钥加密 C=M^d mod n
	def rsa_encrypt(self,s,dir):
		with open(dir, 'r') as f:
			temp = f.read()
		ne = temp.split(',')
		# print("ne",ne)
		n = int(ne[0][11:])
		d = int(ne[4])
		string =binascii.b2a_hex(s.encode())
		intstr = bytes_to_int(string)
		cryptot = ("%x"%powmod(intstr,d,n))
		if len(cryptot)%2 == 1:
			cryptot = '0'+cryptot
		return binascii.a2b_hex(cryptot)
	#解密 M=C^d mod n
	def rsa_decrypt(self,string,n,e):
		intstr = bytes_to_int(string)
		content = ("%x"%powmod(intstr,e,n))
		if len(content)%2 == 1:
			content = '0' + content
		return binascii.a2b_hex(content)

rsa_key内存储生成的密钥,调用python的rsa库
在这里插入图片描述

Connection.py

# -*- coding: UTF-8 -*-
from socket import *
#保存client与server通信时的公有量
class connect():
    #发送连接请求
    def client(self,C_ip,C_port):
        # 绑定对象服务器
        HOST = C_ip#192.168.43.198
        PORT=C_port
        ADDR = (HOST, PORT)
        # 面向网络的TCP数据报流
        global tcpCliSock, tcpSerSock
        tcpCliSock = socket(AF_INET, SOCK_STREAM)
        tcpCliSock.connect(ADDR)
        print("client connects successfully")
    #服务端等待连接
    def server(self,S_ip,S_port):
        HOST = S_ip#192.168.43.100
        PORT = S_port
        ADDR = (HOST,PORT)
        global tcpCliSock,tcpSerSock
        tcpSerSock = socket(AF_INET, SOCK_STREAM)
        tcpSerSock.bind(ADDR)
        tcpSerSock.listen(5)
        tcpCliSock, addr =tcpSerSock.accept()
        print("server is connected successfully")
    #发送,报文需提前写好且格式为bytes
    def send_data(self,pack):
        tcpCliSock.send(pack)
        print("send successfully")
    #接受报文
    def getdata(self):
        while 1:
            data = tcpCliSock.recv(1024)
            if data!=b'':
                print("RECEIEVE", data)
                #print("flag_get3\n",tcp.flag)
                return data

DH_Client.py

# -*- coding: UTF-8 -*-
import rsa
import random
import connection
import HASH,DES
import RSA_sign
import binascii
class DH_C:
    def __init__(self,length=1024):
        self.length=length
        return
    #得到一个大素数p,从rsa方法内选择,且不与下加密签名内相同
    def get_prime(self,length):
        prime=rsa.newkeys(length)[1]
        string= str(prime).split(',')
        p = int(string[3][1:])
        print("p")
        print(p)
        return p
    #生成本原元,但是由于基数过大,所以本实验默认为2
    def get_generator(self,p):
        if p == 0:
            return
        a = 2
        while 1:
            if a ** (p - 1)% p== 1:
                n = 2
                mark = 0
                while n < p - 1:
                    if a ** n % p == 1:
                        mark = 1
                    n += 1
            if mark == 0:
                print(a)
                return a
            a += 1
    #得到随机数rand_A
    def get_random_a(self,p):
        rand_A = random.randint(0, p - 1)
        print("rand_A\n",rand_A)
        return rand_A
    #计算Client的cal_A
    def cal_A(self,g,random_A,p):
        cal_A=pow(g,random_A,p)
        print("cal_A\n",cal_A)
        return cal_A
    #进行公有信息打包,利用space分割,便于传输
    def pre_pack(self, p, g,C_n, C_pubkey):
        pack = bytes(str(p) + 'space' + str(g) + 'space' + str(C_n) + 'space' +str(C_pubkey) + 'space' + 'hello' + 'space', 'utf-8')
        return pack
    #进行加密信息打包,source_C为附加的HASH验证
    def pack(self, A, source_C):
        pack = bytes(str(A) + 'space', 'utf-8') + source_C
        return pack
    #解析Server发来的B,S_Key与对应的两个签名
    def pre_prase(self, data):
        string = data.split(b'space')
        S_pubkey = int(string[0])
        S_n=int(string[1])
        message = string[2]
        print("S_pubkey\n", S_pubkey)
        print("S_n\n", S_n)
        print("message\n", message)
        return S_pubkey,S_n, message
    def data_parse(self,data):
        string = data.split(b'space')
        B = int(string[0])
        source_B=string[1]
        print("B\n", B)
        print("source_B\n",source_B)
        return B,source_B
    #计算共享密钥
    def C_get_Key(self,g,A,p):
        C_Key= pow(g, A, p);
        print("C_key\n",C_Key)
        with open('./key/DH_C_key.txt', 'w') as f:
            f.write(str(C_Key))
        return C_Key
if __name__ == '__main__':
    dh_c = DH_C(256)
    share=connection.connect()
    hash=HASH.HASH()
    C=RSA_sign.rsa_crypto()

    share.client('127.0.0.1',21567)
    #发送公有的数据
    p = dh_c.get_prime(dh_c.length)
    g = 2
    C_n,C_pubkey=C.generate_key('./key/DH_C_signkey.txt')
    pack=dh_c.pre_pack(p,g,C_n,C_pubkey)
    share.send_data(pack)
    #解析传递的公有数据
    data=share.getdata()
    (S_pubkey,S_n,message)=dh_c.pre_prase(data)
    rand_A = dh_c.get_random_a(p)
    A = dh_c.cal_A(g, rand_A, p)
    complete=hash.SHA_1(str(A))
    source_C=C.rsa_encrypt(complete,'./key/DH_C_signkey.txt')
    #传输加密后的数据
    pack=dh_c.pack(A,source_C)
    share.send_data(pack)
    #接受并解析加密后的数据
    data = share.getdata()
    (B,source_B)=dh_c.data_parse(data)
    #解密签名并计算获得值的HASH,比对正确说明无丢失来源正确,可计算得到共享密钥
    complete_B=hash.SHA_1(str(B))
    cal_source_B=C.rsa_decrypt(source_B,S_n,S_pubkey)
    cal_source_B= binascii.a2b_hex(cal_source_B).decode()
    if (complete_B==cal_source_B):
        C_Key = dh_c.C_get_Key(B, rand_A, p)
        with open('./key/DH_C_key.txt', 'w') as f:
            f.write(str(C_Key))
            #使用商量好的密钥对称加密
            des=DES.des()
            des_key=str(C_Key)[0:8]
            with open('./key/DH_Sec_C.txt', 'w') as f2:
                f2.write(des_key)
            des.encryptDes('./input/send_message.txt', './key/DH_Sec_C.txt', './output/des_encrypt_message.txt')

DH_Server.py

# -*- coding: UTF-8 -*-
import random
import connection
import HASH,DES
import RSA_sign
import binascii
class DH_S:
    def __init__(self):
        return
    #得到随机数rand_b
    def get_random_b(self,p):
        rand_B = random.randint(0, p-1)
        print("rand_B",rand_B)
        return rand_B
    #解析公有的信息内容
    def pre_parse(self, data):
        string = data.split(b'space')
        p = int(string[0])
        g = int(string[1])
        C_n=int(string[2])
        C_pubkey=int(string[3])
        message=string[4]
        print("p\n", p)
        print("g\n", g)
        print("C_n\n",type(C_n),C_n)
        print("C_pubkey\n", C_pubkey)
        print("message\n", message)
        return p, g, C_n,C_pubkey, message
    #解析含hash的加密信息
    def data_parse(self, data):
        string = data.split(b'space')
        A = int(string[0])
        signature = string[1]
        print("A\n", A)
        print("signature\n", signature)
        return A, signature
    #计算B与S_Key
    def cal_B(self, g, random_B, p):
        cal_B = pow(g, random_B, p);
        print("cal_B", cal_B)
        return cal_B
    def S_get_Key(self, A, rand_B, p):
        S_Key = pow(int(A), rand_B, p)
        print("S_key", S_Key)
        with open('./key/DH_S_key.txt', 'w') as f:
            f.write(str(S_Key))
        return S_Key
    #打包公有信息
    def pre_pack(self, S_pubkey,S_n, message):
        pack = bytes(str(S_pubkey) + 'space'+ str(S_n)+ 'space', 'utf-8') + message
        return pack
    #打包加密信息
    def pack(self,B,source_B):
        pack =bytes(str(B)+'space','utf-8')+source_B
        return pack
if __name__ == '__main__':
    share = connection.connect()
    dh_s = DH_S()
    hash = HASH.HASH()
    S = RSA_sign.rsa_crypto()
    #循环等待实现多次认证
    while 1:
        share.server('127.0.0.1',21567)
        #接受公有信息
        data=share.getdata()
        (p, g, C_n,C_pubkey,message) = dh_s.pre_parse(data)
        S_n,S_pubkey = S.generate_key('./key/DH_S_signkey.txt')
        pack=dh_s.pre_pack(S_pubkey,S_n,message)
        share.send_data(pack)
        #接受加密的信息
        data = share.getdata()
        (A,signature)=dh_s.data_parse(data)
        orgin_source = hash.SHA_1(str(A))
        complete =S.rsa_decrypt(signature,C_n,C_pubkey)
        print(complete)
        cal_source=(binascii.a2b_hex(complete).decode())
        print("orgin_source\n",orgin_source)
        #若验证了得到的共享内容正确
        if cal_source==orgin_source:
            #发送加密信息
            print("it is a right pack")
            rand_B = dh_s.get_random_b(p)
            B = dh_s.cal_B(g, rand_B, p)
            S_Key = dh_s.S_get_Key(A, rand_B, p)
            complete_B = hash.SHA_1(str(B))
            source_B= S.rsa_encrypt(complete_B,'./key/DH_S_signkey.txt')
            pack=dh_s.pack(B,source_B)
            share.send_data(pack)
            with open('./key/DH_S_key.txt', 'w') as f:
                f.write(str(S_Key))
                #利用得到的对称密钥加密
                des=DES.des()
                des_key=str(S_Key)[0:8]
                with open('./key/DH_Sec_S.txt','w') as f2:
                    f2.write(des_key)
                des.decryptDes('./output/des_encrypt_message.txt','./key/DH_Sec_S.txt', './output/des_decrypt_message.txt')

call_DH.py

# -*- coding: utf-8 -*-
import sys,binascii
import DES,RSA_sign,DH_Client,DH_Server,connection,HASH
from PyQt5.QtWidgets import QApplication, QMainWindow
#导入designer工具生成的login模块
from DH import Ui_MainWindow
class MyMainForm(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyMainForm, self).__init__(parent)
        self.setupUi(self)
        self.button_begin.clicked.connect(self.run_begin)
        self.button_client.clicked.connect(self.run_button_client)
        self.button_server.clicked.connect(self.run_button_server)
        self.button_client_connect.clicked.connect(self.run_button_client_connect)
        self.button_server_connect.clicked.connect(self.run_button_server_connect)
        self.button_pre_C_send.clicked.connect(self.run_button_pre_C_send)
        self.button_pre_S_send.clicked.connect(self.run_button_pre_S_send)
        self.button_C_send.clicked.connect(self.run_button_C_send)
        self.button_S_send.clicked.connect(self.run_button_S_send)
        self.button_S_getkey.clicked.connect(self.run_button_S_getkey)
        self.button_C_getkey.clicked.connect(self.run_button_C_getkey)
        self.button_sec_C.clicked.connect(self.run_button_sec_C)
        self.button_sec_S.clicked.connect(self.run_button_sec_S)

    def run_begin(self):
        global share, dh_c, dh_s, hash, C, S, des
        share = connection.connect()
        dh_c = DH_Client.DH_C(48)#控制DH生成密钥的长度,但是有一定误差
        dh_s = DH_Server.DH_S()
        hash = HASH.HASH()
        C = RSA_sign.rsa_crypto()
        S = RSA_sign.rsa_crypto()
        des=DES.des()
        self.show_config.setText("设置成功")

    def run_button_client(self):
        self.button_server.setEnabled(False)
        self.button_S_send.setEnabled(False)
        self.button_S_getkey.setEnabled(False)
        self.button_server_connect.setEnabled(False)
        self.show_S_send.setEnabled(False)
        self.output_S_key.setEnabled(False)
        self.output_pre_S_send.setEnabled(False)
        self.output_sec_S.setEnabled(False)
        self.button_pre_S_send.setEnabled(False)
        self.button_sec_S.setEnabled(False)
        self.label_ip.setText("请输入通信对象IP:")

    def run_button_server(self):
        self.button_client.setEnabled(False)
        self.button_C_send.setEnabled(False)
        self.button_C_getkey.setEnabled(False)
        self.button_client_connect.setEnabled(False)
        self.show_C_send.setEnabled(False)
        self.output_C_key.setEnabled(False)
        self.output_pre_C_send.setEnabled(False)
        self.output_sec_C.setEnabled(False)
        self.button_pre_C_send.setEnabled(False)
        self.button_sec_C.setEnabled(False)
        self.label_ip.setText("请输入本机IP:")

    def run_button_server_connect(self):
        ip = self.input_ip.text()
        port = int(self.input_port.text())
        share.server(ip, port)
        self.show_connect.setText("连接成功,为Server端")

    def run_button_client_connect(self):
        ip = self.input_ip.text()
        port = int(self.input_port.text())
        share.client(ip, port)
        self.show_connect.setText("连接成功,为Client端")

    def run_button_pre_C_send(self):
        global p_A,g_A,C_pubkey
        p_A = dh_c.get_prime(512)
        self.output_pre_C_send.setText("p生成完毕:\n")
        self.output_pre_C_send.append(str(p_A))
        g_A = 2
        self.output_pre_C_send.append("g生成完毕:\n")
        self.output_pre_C_send.append(str(g_A))
        C_n, C_pubkey = C.generate_key('./key/DH_C_signkey.txt')
        self.output_pre_C_send.append("Client端RSA公私钥对生成完毕,输出C_n:\n")
        self.output_pre_C_send.append(str(C_n))
        self.output_pre_C_send.append("输出C_pubkey:\n")
        self.output_pre_C_send.append(str(C_pubkey))
        pack = dh_c.pre_pack(p_A, g_A, C_n, C_pubkey)
        self.output_pre_C_send.setText("打包p,g,C_n,C_pubkey完成并发送hello:\n")
        self.output_pre_C_send.append(str(pack))
        share.send_data(pack)
        self.output_pre_C_send.append("发送包成功")

    def run_button_pre_S_send(self):
        global C_n,C_pubkey,p_B,g_B
        data = share.getdata()
        self.output_pre_S_send.setText("接收到包:\n")
        (p_B, g_B, C_n, C_pubkey, message) = dh_s.pre_parse(data)
        self.output_pre_S_send.append("获得p:\n")
        self.output_pre_S_send.append(str(p_B))
        self.output_pre_S_send.append("获得g:\n")
        self.output_pre_S_send.append(str(g_B))
        self.output_pre_S_send.append("获得C_n:\n")
        self.output_pre_S_send.append(str(C_n))
        self.output_pre_S_send.append("获得C_pubkey:\n")
        self.output_pre_S_send.append(str(C_pubkey))
        S_n, S_pubkey = S.generate_key('./key/DH_S_signkey.txt')
        self.output_pre_S_send.append("Server端RSA公私钥对生成完毕,输出S_n:\n")
        self.output_pre_S_send.append(str(S_n))
        self.output_pre_S_send.append("输出S_pubkey:\n")
        self.output_pre_S_send.append(str(S_pubkey))
        pack = dh_s.pre_pack(S_pubkey, S_n, message)
        self.output_pre_S_send.append("打包S_n,S_pubkey完毕并回复原消息:\n")
        self.output_pre_S_send.append(str(pack))
        share.send_data(pack)
        self.output_pre_S_send.append("包发送完毕\n")

    def run_button_C_send(self):
        global rand_A,p_A,S_pubkey,S_n
        data = share.getdata()
        self.show_C_send.setText("接受到包:\n")
        (S_pubkey, S_n, message) = dh_c.pre_prase(data)
        self.show_C_send.append("获得S_n:\n")
        self.show_C_send.append(str(S_n))
        self.show_C_send.append("获得S_pubkey:\n")
        self.show_C_send.append(str(S_pubkey))
        rand_A = dh_c.get_random_a(p_A)
        self.show_C_send.append("生成随机元rand_A:\n")
        self.show_C_send.append(str(rand_A))
        A = dh_c.cal_A(g_A, rand_A, p_A)
        self.show_C_send.append("计算获得A:\n")
        self.show_C_send.append(str(A))
        complete = hash.SHA_1(str(A))
        self.show_C_send.append("对A生成HASH摘要:\n")
        self.show_C_send.append(str(complete))
        source_C = C.rsa_encrypt(complete, './key/DH_C_signkey.txt')
        self.show_C_send.append("对A的摘要使用Client的私钥进行签名:\n")
        self.show_C_send.append(str(source_C))
        pack = dh_c.pack(A, source_C)
        self.show_C_send.append("打包A与A的数字签名完毕\n")
        self.show_C_send.append(str(pack))
        share.send_data(pack)
        self.show_C_send.append("发送包成功\n")


    def run_button_S_send(self):
        global A,rand_B
        data = share.getdata()
        self.show_S_send.setText("收到包\n")
        (A, signature_A) = dh_s.data_parse(data)
        self.show_S_send.append("A:\n")
        self.show_S_send.append(str(A))
        self.show_S_send.append("A的数字签名:\n")
        self.show_S_send.append(str(signature_A))
        complete_A = hash.SHA_1(str(A))
        self.show_S_send.append("本地计算A的HASH值为\n")
        self.show_S_send.append(str(complete_A))
        source_A = S.rsa_decrypt(signature_A, C_n, C_pubkey)
        source_A = binascii.a2b_hex(source_A).decode()
        self.show_S_send.append("使用Server的私钥解签A的HASH值为:\n")
        self.show_S_send.append(str(source_A))
        # 若验证了得到的共享内容正确
        if complete_A == source_A:
            self.show_S_send.append("A的完整性与来源性验证正确\n")
            rand_B = dh_s.get_random_b(p_B)
            self.show_S_send.append("生成随机元rand_B:\n")
            self.show_S_send.append(str(rand_B))
            B = dh_s.cal_B(g_B, rand_B, p_B)
            self.show_S_send.append("根据g,rand_B,p计算得到B\n")
            self.show_S_send.append(str(B))
            complete_B = hash.SHA_1(str(B))
            self.show_S_send.append("对B生成HASH摘要\n")
            self.show_S_send.append(str(complete_B))
            source_B = S.rsa_encrypt(complete_B, './key/DH_S_signkey.txt')
            self.show_S_send.append("对B的摘要使用Server的私钥进行签名\n")
            self.show_S_send.append(str(source_B))
            pack = dh_s.pack(B,source_B)
            self.show_S_send.append("打包B与B的数字签名\n")
            self.show_S_send.append(str(pack))
            share.send_data(pack)
            self.show_S_send.append("发送包成功\n")

    def run_button_C_getkey(self):
        data = share.getdata()
        self.output_C_key.setText("接收到包\n")
        (B,signature_B) = dh_c.data_parse(data)
        self.output_C_key.append("B:\n")
        self.output_C_key.append(str(B))
        self.output_C_key.append("B的数字签名:\n")
        self.output_C_key.append(str(signature_B))
        complete_B = hash.SHA_1(str(B))
        self.output_C_key.append("B的本地计算HASH为:\n")
        self.output_C_key.append(str(complete_B))
        source_B = C.rsa_decrypt(signature_B, S_n, S_pubkey)
        source_B = binascii.a2b_hex(source_B).decode()
        self.output_C_key.append("使用Client的公钥解签得B的HASH为:\n")
        self.output_C_key.append(str(source_B))
        if (complete_B == source_B):
            self.output_C_key.append("B的来源性与完整性验证成功:\n")
            C_Key = dh_c.C_get_Key(B, rand_A, p_A)
            self.output_C_key.append("根据B,rand_A,p_A计算共享密钥C_Key:\n")
            self.output_C_key.append(str(C_Key))
            with open('./key/DH_C_key.txt','w') as f:
                f.write(str(C_Key))
    def run_button_S_getkey(self):
        S_Key = dh_s.S_get_Key(A, rand_B, p_B)
        self.output_S_key.setText("根据A,rand_B,p_B计算共享密钥S_Key\n")
        self.output_S_key.append(str(S_Key))
        with open('./key/DH_S_key.txt', 'w') as f:
            f.write(str(S_Key))

    def run_button_sec_C(self):
        with open('./key/DH_C_key.txt', 'r') as f:
            C_des_key=f.read()[0:8]
        with open('./key/DH_Sec_C.txt', 'w') as f2:
           f2.write(C_des_key)
        self.output_sec_C.setText("取共享密钥前64位作为DES密钥加密消息")
        des.encryptDes('./input/send_message.txt', './key/DH_Sec_C.txt', './output/des_encrypt_message.txt')
        with open('./input/send_message.txt', 'r',encoding='utf-8') as f3:
           message=f3.read()
        with open('./output/des_encrypt_message.txt',encoding='utf-8') as f4:
           encrypto=f4.read()
        self.output_sec_C.append("明文为;")
        self.output_sec_C.append(str(message))
        self.output_sec_C.append("加密成功,密文为;")
        self.output_sec_C.append(str(encrypto))
    def run_button_sec_S(self):
        with open('./key/DH_S_key.txt', 'r') as f:
            S_des_key=f.read()[0:8]
        with open('./key/DH_Sec_S.txt', 'w') as f2:
           f2.write(S_des_key)
        self.output_sec_S.setText("取共享密钥前64位作为DES密钥解密消息")
        des.decryptDes('./output/des_encrypt_message.txt', './key/DH_Sec_S.txt', './output/des_decrypt_message.txt')
        self.output_sec_S.append("解密完成,请查看./output/des_decrypt_message.txt获取解密后信息")
        with open('./output/des_encrypt_message.txt', 'r',encoding='utf-8') as f3:
           encrypto=f3.read()
        with open('./output/des_decrypt_message.txt', 'r',encoding='utf-8') as f4:
           decrypto=f4.read()
        self.output_sec_S.append("密文为;")
        self.output_sec_S.append(str(encrypto))
        self.output_sec_S.append("解密后消息为;")
        self.output_sec_S.append(str(decrypto))

if __name__ == "__main__":
     #固定的,PyQt5程序都需要QApplication对象。sys.argv是命令行参数列表,确保程序可以双击运行
     app = QApplication(sys.argv)
     #初始化
     myWin = MyMainForm()
     #将窗口控件显示在屏幕上
     myWin.show()
     #程序运行,sys.exit方法确保程序完整退出。
     sys.exit(app.exec_())

DH.py(用于Qt界面设计)

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'DH.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1000, 1000)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QtCore.QRect(11, 51, 646, 843))
        self.layoutWidget.setObjectName("layoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.button_pre_C_send = QtWidgets.QPushButton(self.layoutWidget)
        self.button_pre_C_send.setObjectName("button_pre_C_send")
        self.gridLayout.addWidget(self.button_pre_C_send, 3, 0, 1, 1)
        self.button_S_send = QtWidgets.QPushButton(self.layoutWidget)
        self.button_S_send.setObjectName("button_S_send")
        self.gridLayout.addWidget(self.button_S_send, 4, 2, 1, 1)
        self.label_port = QtWidgets.QLabel(self.layoutWidget)
        self.label_port.setAlignment(QtCore.Qt.AlignCenter)
        self.label_port.setObjectName("label_port")
        self.gridLayout.addWidget(self.label_port, 2, 2, 1, 1)
        self.output_pre_C_send = QtWidgets.QTextBrowser(self.layoutWidget)
        self.output_pre_C_send.setObjectName("output_pre_C_send")
        self.gridLayout.addWidget(self.output_pre_C_send, 3, 1, 1, 1)
        self.button_server = QtWidgets.QPushButton(self.layoutWidget)
        self.button_server.setObjectName("button_server")
        self.gridLayout.addWidget(self.button_server, 1, 2, 1, 1)
        self.show_C_send = QtWidgets.QTextBrowser(self.layoutWidget)
        self.show_C_send.setObjectName("show_C_send")
        self.gridLayout.addWidget(self.show_C_send, 4, 1, 1, 1)
        self.button_sec_C = QtWidgets.QPushButton(self.layoutWidget)
        self.button_sec_C.setObjectName("button_sec_C")
        self.gridLayout.addWidget(self.button_sec_C, 6, 0, 1, 1)
        self.button_pre_S_send = QtWidgets.QPushButton(self.layoutWidget)
        self.button_pre_S_send.setObjectName("button_pre_S_send")
        self.gridLayout.addWidget(self.button_pre_S_send, 3, 2, 1, 1)
        self.show_config = QtWidgets.QLabel(self.layoutWidget)
        self.show_config.setAlignment(QtCore.Qt.AlignCenter)
        self.show_config.setObjectName("show_config")
        self.gridLayout.addWidget(self.show_config, 0, 1, 1, 1)
        self.button_sec_S = QtWidgets.QPushButton(self.layoutWidget)
        self.button_sec_S.setObjectName("button_sec_S")
        self.gridLayout.addWidget(self.button_sec_S, 6, 2, 1, 1)
        self.button_begin = QtWidgets.QPushButton(self.layoutWidget)
        self.button_begin.setObjectName("button_begin")
        self.gridLayout.addWidget(self.button_begin, 0, 0, 1, 1)
        self.button_client = QtWidgets.QPushButton(self.layoutWidget)
        self.button_client.setObjectName("button_client")
        self.gridLayout.addWidget(self.button_client, 1, 0, 1, 1)
        self.output_pre_S_send = QtWidgets.QTextBrowser(self.layoutWidget)
        self.output_pre_S_send.setObjectName("output_pre_S_send")
        self.gridLayout.addWidget(self.output_pre_S_send, 3, 4, 1, 1)
        self.label_connect = QtWidgets.QLabel(self.layoutWidget)
        self.label_connect.setAlignment(QtCore.Qt.AlignCenter)
        self.label_connect.setObjectName("label_connect")
        self.gridLayout.addWidget(self.label_connect, 0, 2, 1, 1)
        self.label_ip = QtWidgets.QLabel(self.layoutWidget)
        self.label_ip.setAlignment(QtCore.Qt.AlignCenter)
        self.label_ip.setObjectName("label_ip")
        self.gridLayout.addWidget(self.label_ip, 2, 0, 1, 1)
        self.input_port = QtWidgets.QLineEdit(self.layoutWidget)
        self.input_port.setObjectName("input_port")
        self.gridLayout.addWidget(self.input_port, 2, 4, 1, 1)
        self.output_sec_S = QtWidgets.QTextBrowser(self.layoutWidget)
        self.output_sec_S.setObjectName("output_sec_S")
        self.gridLayout.addWidget(self.output_sec_S, 6, 4, 1, 1)
        self.output_sec_C = QtWidgets.QTextBrowser(self.layoutWidget)
        self.output_sec_C.setObjectName("output_sec_C")
        self.gridLayout.addWidget(self.output_sec_C, 6, 1, 1, 1)
        self.output_S_key = QtWidgets.QTextBrowser(self.layoutWidget)
        self.output_S_key.setObjectName("output_S_key")
        self.gridLayout.addWidget(self.output_S_key, 5, 4, 1, 1)
        self.button_client_connect = QtWidgets.QPushButton(self.layoutWidget)
        self.button_client_connect.setObjectName("button_client_connect")
        self.gridLayout.addWidget(self.button_client_connect, 1, 1, 1, 1)
        self.output_C_key = QtWidgets.QTextBrowser(self.layoutWidget)
        self.output_C_key.setObjectName("output_C_key")
        self.gridLayout.addWidget(self.output_C_key, 5, 1, 1, 1)
        self.button_C_getkey = QtWidgets.QPushButton(self.layoutWidget)
        self.button_C_getkey.setObjectName("button_C_getkey")
        self.gridLayout.addWidget(self.button_C_getkey, 5, 0, 1, 1)
        self.show_S_send = QtWidgets.QTextBrowser(self.layoutWidget)
        self.show_S_send.setObjectName("show_S_send")
        self.gridLayout.addWidget(self.show_S_send, 4, 4, 1, 1)
        self.input_ip = QtWidgets.QLineEdit(self.layoutWidget)
        self.input_ip.setObjectName("input_ip")
        self.gridLayout.addWidget(self.input_ip, 2, 1, 1, 1)
        self.button_C_send = QtWidgets.QPushButton(self.layoutWidget)
        self.button_C_send.setObjectName("button_C_send")
        self.gridLayout.addWidget(self.button_C_send, 4, 0, 1, 1)
        self.button_S_getkey = QtWidgets.QPushButton(self.layoutWidget)
        self.button_S_getkey.setObjectName("button_S_getkey")
        self.gridLayout.addWidget(self.button_S_getkey, 5, 2, 1, 1)
        self.show_connect = QtWidgets.QLabel(self.layoutWidget)
        self.show_connect.setAlignment(QtCore.Qt.AlignCenter)
        self.show_connect.setObjectName("show_connect")
        self.gridLayout.addWidget(self.show_connect, 0, 4, 1, 1)
        self.button_server_connect = QtWidgets.QPushButton(self.layoutWidget)
        self.button_server_connect.setObjectName("button_server_connect")
        self.gridLayout.addWidget(self.button_server_connect, 1, 4, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 18))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.button_pre_C_send.setText(_translate("MainWindow", "通信验证"))
        self.button_S_send.setText(_translate("MainWindow", "数据发送"))
        self.label_port.setText(_translate("MainWindow", "Port"))
        self.button_server.setText(_translate("MainWindow", "Server"))
        self.button_sec_C.setText(_translate("MainWindow", "保密通信"))
        self.button_pre_S_send.setText(_translate("MainWindow", "通信验证"))
        self.show_config.setText(_translate("MainWindow", "statue"))
        self.button_sec_S.setText(_translate("MainWindow", "保密通信"))
        self.button_begin.setText(_translate("MainWindow", "初始化配置"))
        self.button_client.setText(_translate("MainWindow", "Client"))
        self.label_connect.setText(_translate("MainWindow", "连接状态"))
        self.label_ip.setText(_translate("MainWindow", "IP:"))
        self.button_client_connect.setText(_translate("MainWindow", "client_connect"))
        self.button_C_getkey.setText(_translate("MainWindow", "交换密钥生成"))
        self.button_C_send.setText(_translate("MainWindow", "数据发送"))
        self.button_S_getkey.setText(_translate("MainWindow", "交换密钥生成"))
        self.show_connect.setText(_translate("MainWindow", "out_of_connection"))
        self.button_server_connect.setText(_translate("MainWindow", "server_connect"))

结果展示

可以发现共享密钥生成的部分产生的内容是一样的。下图演示为本地演示,实际可在一个局域网下的不同主机进行结果实现。每次通信都可以重新生成一个新的对称密钥进行通信。
在这里插入图片描述

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值