094_基于Linux的密文聊天系统
![](/images/defaultpic.gif)
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
3 系统需求分析
3.1 聊天程序功能分析
1 注册功能
通常聊天程序需要用户名和密码才能使用,所以需要实现web注册功能,这样用户可以很方便的通过web网站注册自己的用户名并取得密码,还可以在服务器上存储个人相关信息以便他人查看。
2 登陆功能
用户在聊天之前需要输入用户名和密码进行登陆以便获取自身相关信息和好友相关信息,故登陆过程中服务器需对用户名和密码进行必要的核对。
3 聊天功能
这是聊天程序的主要功能。用户之间的相互通信必须及时快速的由服务器转发。
3.2 加密算法
由于是加密聊天程序,故对聊天明文的加密算法应选取加密速度相对较快的对称加密算法(如:DES),又由于DES的加密密钥是不能公开的秘密密钥,故对DES的密钥应加密传送,所以应采用非对称的公钥加密算法(如RSA)用以分发DES密钥。
DES加密算法:
作为对称加密算法中的DES加密算法由于其加密过程是固定不变的,故应考虑其密钥的生成。由于弱密钥存在的可能性,还应该考虑如何避免生成弱密钥。因为差分分析法的提出可以快速的破解少于16轮迭代的DES算法,故应保证其迭代次数至少为16轮。 【买计算机毕业论文就到www.think58.com】
RSA加密算法: 本文来自think58 [资料来源:http://think58.com]
由于RSA是基于大素数因子分解这一数学难题提出的,故RSA中公钥和私钥的产生应重点考虑。又由于RSA的运算强度较大,故还应考虑如何加速其运算速度。
4 系统总体设计和模块划分
4.1 系统总体设计 copyright think58
图1系统设计
如图1所示,本系统采用C/S模式。
1 用户通过web应用程序注册帐号,然后用注册的帐号登陆聊天程序服务器。
2 客户端产生生成DES密钥,服务器端在启动时初始化产生RSA公钥和私钥。当客户端向服务器发起连接时,服务器送出RSA公钥,客户端用取得的公钥加密产生的DES私钥回传服务器。
3 最后服务器与客户端双方的通信均由DES加密算法加密通信明文。
think58好,好think58
4.2 模块划分
4.2.1 DES算法模块
1 加密算法3个主要步骤
第一步,初始置换IP
图2 初始置换表IP
图2为初始置换表IP,64bit输入明文经过该表完成初始置换。
think58好,好think58
第二步,16轮迭代
图3 16轮迭代
图3为DES16轮迭代,将经过初始置换的数据分成Li和Ri两部分。将Ri直接交换为Li+1,Li与Ri经过f函数处理后的数据相异或得Ri+1,最后一轮不做交换。
第三步,逆置换
图4 逆置换表(IP-1)
图4为逆置换表(IP-1),经过16轮迭代后通过该表置换得到输出的密文。
2 子密钥的产生 内容来自think58 [资料来源:http://www.THINK58.com]
图5 生成子密钥
图5为子密钥生成过程,将64bit初始密钥经过PC-1表置换为56bit输入,分为Ci, Di两组分别进行LS循环左移,再经过PC-2表压缩为48bit子密钥。如此循环16轮生成16组子密钥。
内容来自think58
4.2.2 RSA算法模块
1 大数的运算
加法运算:
设定相应的进位变量c,按位相加,如ri = ai + bi + c,当ai + bi + c > m (m为权值),c送1,ri = (ai + bi + c) mod m, 否则c送0。
减法运算:
设定相应的借位变量c,按位相减,如ri = ai – bi + c,当ai < bi时,c送m (m为权值),还要将ai高一位减1,如过高位连续为0则依次置m – 1,一直到第一个非0位并将其减1,否则c送0。
乘法运算:
设定相应的进位变量c,和一个取当前结果位值变量d,双重循环。外层循环依次取运算数A的相应位,内层循环依次取B的相应位。r(i + j) = d + ai * bj + c,当d + ai * bi + c > m (m位权值),c送ri/m (m为权值),d为从对应的内外循环位之和(i + j)对应的结果位上取得的值。r(i + j)暂时存入对应的结果位。
除法运算:
假设A为被除数,B为除数。当A > B,将B扩大到A相同位数,循环做A = A – Bk (扩充后的B),商位qi = qi + 1,最后A为余数。
取余运算:
依除法运算输出余数A。
乘方运算:
与乘法运算一样设有进位变量c和取当前结果位值变量d。依然分内外两层循环。外层循环中d = r (2 * i),r(2 * i) = d + ai * ai,在此仅计算相同位ai的乘积存入结果位r(2 * i)中。内层循环d = r (i + j),r(i + j) = d + 2 * ai * aj + c,这里由于乘数A和被乘数B相等,故可以采用2 * ai * aj,这种方式提前运算对应位。可以看出这种预处理方式加快了运算速度。 think58.com [资料来源:http://www.THINK58.com]
模幂运算:
将模幂运算转化为乘模运算。定理:(a * b) mod n = ((a mod n) * (b mod n)) mod n。计算A^m mod n:令c = 1,如果m = m % 2 == 0 循环计算 A = (A * A) mod n 否则 m = m – 1,c = (A * c) mod n。最后输出c。
2 选取P,Q
先以生成随机数的方式生成随机奇数A、B。再让A、B依次通过Miller-Rabin素性测试。
Miller-Rabin素性测试:先计算出m、j,使得n-1=m*2^j,其中m是正奇数,j是非负整数,随机取一个b,2<=b,计算v=b^m mod n,如果v==1,通过测试,返回。令i=1,循环以后步骤,如果v=n-1,通过测试,返回。如果i==j,非素数,结束。v=v^2 mod n,i=i+1。
3 欧几里德算法求a,b最大公因数和逆元
定理:gcd (a, b) = gcd (b, a mod b) (设a > b)
r = a mod b, a = b,b = r 循环以上三步直到r = 0, 则a为所求最小公因数。r = a mod b => x * a + y * b = r。 x称为a的逆元。在每步循环过程中将前一步中的r代入下一步中合并后可求得逆元x。
本文来自think58 [版权所有:http://think58.com]
[资料来源:http://THINK58.com]4.2.3 聊天程序模块
1、数据库设计
用户信息表User_Infor (存储注册用户的信息)
CREATE TABLE User_Info
(
user_id INTEGER AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR (50) NOT NULL,
user_passwd VARCHAR (10) NOT NULL,
user_sex VARCHAR (10),
user_age INTEGER,
user_address VARCHAR (100),
INDEX (user_name)
) ENGINE = InnoDB; #指定存储引擎
好友关系表Friend_Index (记录用户添加的好友)
CREATE TABLE User_Online
(
user_id INTEGER PRIMARY KEY,
ip_address VARCHAR (100) NOT NULL,
conn_socket INTEGER NOT NULL,
FOREIGN KEY (user_id) REFERENCES User_Info (user_id)
) ENGINE = InnoDB;
在线用户记录表User_Online (记录已登陆的在线用户和与服务器建立的套接口)
CREATE TABLE User_Online
(
user_id INTEGER PRIMARY KEY,
conn_socket INTEGER NOT NULL,
des_key VARCHAR (30) NOT NULL,
FOREIGN KEY (user_id) REFERENCES User_Info (user_id)
) ENGINE = InnoDB;
消息记录表Messages (缓存发给离线用户的消息) think58 [资料来源:http://www.THINK58.com]
CREATE TABLE Messages
(
message_id INTEGER AUTO_INCREMENT PRIMARY KEY,
from_id INTEGER NOT NULL,
to_id INTEGER NOT NULL,
body TEXT NOT NULL,
date_posted TIMESTAMP NOT NULL,
INDEX (to_id),
FOREIGN KEY (from_id) REFERENCES User_Info (user_id),
FOREIGN KEY (to_id) REFERENCES User_Info (user_id)
) ENGINE = InnoDB;
本文来自think58 [来源:http://www.think58.com]
下一篇:vc++24点游戏的开发和实现