**
用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=