用python实现一个简单的加密认证通信系统

**

用python实现一个简单的加密认证通信系统

**

要求:设计实现一个通信系统,双方可以通过消息通信,用户可选择一种加密算法和认证算法,对消息进行加密通信和完整性验证。

实现方案:
客户端与服务器端建立连接,发送的消息在客户端程序进行加密,经过服务器转发给其他客户端,由客户端解密后显示。
首先,在客户端1对要发送的明文使用MD5算法得到消息摘要,然后用客户端1的RSA私钥对摘要进行签名。把得到的签名和明文合在一起生成消息,再对消息使用RC4流秘钥进行加密成密文,通过服务器来进行消息传输。
客户端2接收到密文后使用RC4解密算法进行解密,得到由明文合签名组成的消息,此时对明文再使用一次MD5算法生成消息摘要,使用得到的摘要和客户端1的RSA公钥对签名进行验证,如果签名的认证结果为True,则证明消息确实是有客户端1发送的,且消息为被篡改。如果签名认证的结果为False,则此消息的来源可能不真确,消息的可靠信丧失。
其中,客户端1和客户端2都要生成自己的RSA公私钥对,对于私钥自己保存,对于公钥则可以公布。RC4算法是一种对称加密算法,加密和解密用的都是一个秘钥,这个秘钥由需要进行通信的不同的客户端自行保存。由于RC4算法是一种流加密算法不同于对称分组加密算法,所以我设计了一个函数来拆分解密后得到的消息,最终分别得到明文和签名。

流程图如下:
在这里插入图片描述
在这里插入图片描述
服务器代码:

import tkinter
import socket,threading


win=tkinter.Tk()#创建主窗口
win.title('服务器')
win.geometry("300x200")
users={
   }#用户字典

def run(ck,ca):
    userName=ck.recv(1024)
    users[userName.decode("utf-8")]=ck#解码并存储用户信息
    printStr=""+userName.decode("utf-8")+"连接\n" #在显示框中显示是否连接成功
    text.insert(tkinter.INSERT,printStr)

    while True:
        buffer=[]
        rData=ck.recv(1024) #接受客户端发送的消息
        dataStr=rData.decode("utf-8")
        buffer.append(dataStr)
        infolist=dataStr.split(":")
        #要发送信息的客户端向目标客户端发送消息
        #users[infolist[0]].send((userName.decode("utf-8")+": "+infolist[1]).encode("utf"))
        users[infolist[0]].send((infolist[1]).encode("utf"))

def start():
    ipStr=eip.get()#从输入端中获取ip
    portStr=eport.get()

    server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind((ipStr,int(portStr))) #绑定ip和端口号
    server.listen(10)
    printStr="服务器启动成功\n"
    text.insert(tkinter.INSERT,printStr)

    while True:
        ck,ca=server.accept() #接受所连接的客户端的信息
        t=threading.Thread(target=run,args=(ck,ca))#每连接一个客户端就开启一个线程
        t.start()

def startSever():
    s=threading.Thread(target=start)
    s.start()#开启线程

labelIp = tkinter.Label(win, text='ip').grid(row=0, column=0)
labelPort = tkinter.Label(win, text='port').grid(row=1, column=0)
eip = tkinter.Variable()
eport = tkinter.Variable()
entryIp = tkinter.Entry(win, textvariable=eip).grid(row=0, column=1)
entryPort = tkinter.Entry(win, textvariable=eport).grid(row=
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值