PHPLINUX环境下的密文聊天系统的设计与实现

1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
LINUX环境下的密文聊天系统的设计与实现
think58
[资料来源:http://think58.com]
摘 要
[资料来源:www.THINK58.com]
随着计算机的不断普及和互联网技术在全球领域的高速发展。越来越多的人使用到了聊天程序。聊天程序给人们带来通信便利的同时也存在着一些安全隐患,传统的聊天程序以明文方式传送聊天内容,这样就给一些用心不良的人大开方便之门。本系统正是基于以上原因而设计的加密聊天程序。聊天程序采用服务器/客户端模式。在Linux环境下采用socket套接口编程,服务器程序以创建线程池的方式为每一个客户服务。聊天内容由服务器转发。在聊天程序中加入了对称加密算法DES和非对称加密算法RSA。其基本实现是由服务器端生成RSA的公钥和私钥,由客户端生成DES对称密钥,服务器端传送公钥至客户端加密DES密钥之后回传服务器,服务器再用本地的私钥解密获得DES密钥。此后双方的通信由DES密钥加密后传送,这样既能高效的加密明文又能在信道上安全的传送密钥使得密钥间的共享成为现实。
[资料来源:www.THINK58.com]
本文来自think58 [资料来源:http://www.THINK58.com]
[资料来源:http://www.THINK58.com]
关键词:对称加密算法;非对称加密算法;会话密钥;聊天系统 think58好,好think58 [资料来源:www.THINK58.com]
think58.com [版权所有:http://think58.com]
1.1
[版权所有:http://think58.com]
图6 服务器完成初始化 本文来自think58
[资料来源:THINK58.com]
图6为服务器初始化过程和为已登录用户服务的过程。服务器先生成RSA算法所需的公钥和私钥,当连接到来时服务器送出RSA公钥并等待用户回传DES密钥。当用户传回DES密钥后,服务器用RSA私钥解密得到DES密钥。此后用户登录信息由此DES密钥解密,用户发送的消息由服务器转发。
think58.com
l 线程函数,为登陆客户服务 内容来自think58 [资料来源:http://www.THINK58.com]
void service (int connfd, RSA rsa) 内容来自think58 [资料来源:http://www.THINK58.com]
{ copyright think58 [来源:http://think58.com]
char buf[MAXLINE]
copyright think58 [资料来源:www.THINK58.com]
[资料来源:http://THINK58.com]user_login *login copyright think58 [来源:http://www.think58.com]
int n, check
[资料来源:http://THINK58.com]
unsigned long long key think58 [来源:http://www.think58.com]
publickey pk [资料来源:THINK58.com]
pk.e = rsa.e
think58.com
[资料来源:THINK58.com]
pk.n = rsa.n copyright think58 [资料来源:http://THINK58.com]
send_rsa_publickey (connfd, pk) //发送RSA公钥 内容来自think58
[来源:http://www.think58.com]
cout << 公钥已送出! << endl
cerr << 正在获取des密钥,请稍后.................................... << ends 内容来自think58
key = getdeskey (connfd, rsa) //获取DES私钥 think58好,好think58
cout << ok << endl think58 [资料来源:www.THINK58.com]
if (key == 0) think58.com
[资料来源:http://THINK58.com]
return copyright think58 [资料来源:http://www.THINK58.com]
if ((n = readn (connfd, (void *)buf, MAXLINE)) < 0) //从套接口上读取用户登陆信息 本文来自think58
[来源:http://www.think58.com]
{ think58好,好think58 [资料来源:THINK58.com]
cout << Read from socket connfd false! message: << strerror (errno) << endl think58.com [资料来源:http://think58.com]
exit (ERROR) [资料来源:http://THINK58.com]
}
[来源:http://www.think58.com]
else if (n == 0) think58.com [资料来源:THINK58.com]
{ 本文来自think58 [来源:http://think58.com]
cout << The client close socket. << endl 内容来自think58
[来源:http://www.think58.com]
return
think58 [资料来源:http://www.THINK58.com]
[资料来源:http://think58.com]
} 内容来自think58 [资料来源:http://www.THINK58.com]
login = (user_login *)buf think58
DES_Data *data = new DES_Data ((void *)login->password, 16, key)
bcopy ((void *)data->Decrypting (), (void *)login->password, 11) //解密用户登陆口令 think58好,好think58 [资料来源:http://think58.com]
cout << No. << login->user_id << 请求登录... << endl 本文来自think58 [资料来源:www.THINK58.com]
if (!(check = Attestation (connfd, login))) //认证用户登陆消息
think58.com
{ think58.com [资料来源:www.THINK58.com]
cout << Wrong user name or wrong password! << endl think58好,好think58
cout << 登录失败! << endl
think58好,好think58 [来源:http://www.think58.com]
[资料来源:www.THINK58.com]return
} 内容来自think58
[来源:http://think58.com]
else if (check < 0)
think58好,好think58 [来源:http://www.think58.com]
[来源:http://think58.com]return copyright think58 [资料来源:www.THINK58.com]
cout << 登录成功! << endl think58 [资料来源:www.THINK58.com]
InsertOnline (connfd, login->user_id, key) //插入在线用户表
if (GetFriends (connfd, login->user_id) < 0) //获得好友记录 本文来自think58
[版权所有:http://think58.com]
return copyright think58
[资料来源:www.THINK58.com]
if (GetMessages (connfd, login->user_id, key) < 0) //获取离线消息 [来源:http://www.think58.com]
return copyright think58
[资料来源:http://THINK58.com]
ServFreeChat (connfd, login->user_id, key) //服务在线用户,负责转发消息 think58.com
return
}
l 发送RSA公钥 think58好,好think58 [资料来源:http://think58.com]
Status send_rsa_publickey (int sockfd, publickey key) think58好,好think58 [版权所有:http://think58.com]
{ //向客户端发送RSA公钥 think58好,好think58 [资料来源:http://THINK58.com]
char buf[MAXLINE] think58.com [资料来源:THINK58.com]
int n 本文来自think58 [资料来源:http://www.THINK58.com]
bcopy ((void *)&key, (void *)buf, sizeof (key)) //将RSA公钥拷贝到发送缓冲区
think58.com
[资料来源:www.THINK58.com]
if ((n = writen (sockfd, buf, MAXLINE)) < 0) //向套接口写公钥 copyright think58 [资料来源:http://THINK58.com]
{
cout << Send public key to socket false! message: << strerror (errno) << endl think58.com [资料来源:http://www.THINK58.com]
return (ERROR) think58.com
[版权所有:http://think58.com]
} 内容来自think58
[版权所有:http://think58.com]
return (OK) [资料来源:THINK58.com]
}
[版权所有:http://think58.com]