这个项目是之前的一个作业,主要的实现是希望能通过建立TCP链接并验证身份,最后达到聊天室的目的。具体思路如下
Diffie-Hellman算法 q = 97 a = 5
A生成一个私钥XA(XA<q) = 36 并计算公钥YA=a^XA mod q =50 mod 97
B生成一个私钥XB<q = 58 并计算公钥YB=a^XB mod q = 44 mod 97
用户A产生共享秘密密钥的计算方式是K = (YB)^XA mod q = 44^36 = 75 mod 97
用户B产生共享秘密密钥的计算是K = (YA)^XB mod q = 50^58 = 75 mod 97
因此相当于双方已经交换了一个相同的秘密密钥.
首先打开服务器
服务器等待客户端连接
客户端随机生成私钥和公钥把公钥发给服务器
客户端发送连接请求
服务器生成线程并获取客户端地址
服务器生成素数Q和原根
服务器自己随机生成私钥和公钥并通过客户端的公钥计算会话密钥
服务器生成会话密钥后生成随机消息使用会话密钥摘要、加密,生成验证码
服务器把素数和原根和自己的公钥以及随机消息发给客户端
客户端生成会话密钥
客户端使用会话密钥摘要加密生成验证码发给服务器
服务器对比验证码。确认双方会话密钥相同。向客户端发送确认消息
客户端A接收身份验证成功消息
客户端B验证成功后加入聊天室
发送的消息将以自身与服务器间的会话密钥加密发给服务器
服务器收到消息后解密并存入消息队列
由消息队列向每一个客户端发送由发送目标客户端和服务器之间的会话密钥加密的密文
客户端收到服务器发送的密文后使用自身与服务器之间的会话密钥解密输出
由此,聊天室完成。不过服务器是可以查看所有消息的明文的,只是在传输过程中的加密而以。
客户端A通过AB间的会话密钥加密明文后再通过服务器与客户端A之间的通话密钥加密
将密文发送给服务器
服务器收到密文后,使用服务器与客户端A的会话密钥解密并使用服务器与客户端B的会话密钥加密
服务器将密文转发给B
B使用服务器与B之间的会话密钥解密后再使用AB之间的会话密钥解密