陈繁星 《安全聊天系统的设计与实现》
第 1页 共 32 页
安全聊天系统的设计与实现
摘 要 随着计算机的不断普及和互联网技术在全球领域的高速发展。越来越
多的人使用到了聊天程序。聊天程序给人们带来通信便利的同时也存在着一些
安全隐患,传统的聊天程序以明文方式传送聊天内容,这样就给一些用心不良
的人大开方便之门。本系统正是基于以上原因而设计的加密聊天程序。聊天程
序采用服务器/客户端模式。在 Linux 环境下采用 socket 套接口编程,服务器程
序以创建线程池的方式为每一个客户服务。聊天内容由服务器转发。在聊天程
序中加入了对称加密算法 DES 和非对称加密算法 RSA。其基本实现是由服务器
端生成 RSA 的公钥和私钥,由客户端生成 DES 对称密钥,服务器端传送公钥
至客户端加密 DES 密钥之后回传服务器,服务器再用本地的私钥解密获得 DES
密钥。此后双方的通信由 DES 密钥加密后传送,这样既能高效的加密明文又能
在信道上安全的传送密钥使得密钥间的共享成为现实。
关键词 对称加密算法;非对称加密算法;聊天系统
陈繁星 《安全聊天系统的设计与实现》
第 2页 共 32 页
1.1 课题背景
1 引言
自从 TCP/IP 协议族成为计算机通信的主要网络协议,基于该协议族开发的
网络应用程序数不胜数。聊天程序便是其中之一。聊天程序使人们可以通过互
联网及时传送消息,让远在千里之外的人们畅所欲言。传统的聊天程序在给人
们带来方便的同时也逐渐暴露出一些安全隐患。前不久网上登出了这样一则新
闻:上海某银行的白领丽人,因为聊天程序受监控被同事知道了个人隐私,被
迫辞去了月薪三万余元的工作。于是聊天程序的安全性受到了人们的广泛关注。
1.2 国内外研究现状
从国内外对聊天程序的加密情况看,大多数处理方式是在现有的聊天程序
基础之上添加相应的加密插件来实现加密。比较典型的例子是 Linux 平台下的
多集成聊天程序 Gaim,其中集成了 ICQ、MSN、QQ 等现今主流国内外聊天程序。
普遍的聊天程序没有经过加密而直接传输聊天明文。Gaim 通过添加插件程序对
未加密的聊天程序进行加密传输,通信双方需要只要同时安装加密插件就可以
顺利的对聊天内容进行加密解密。这其中存在一个现而易见的问题:要是一方
加入了加密插件而另一方却没有相应的解密程序显然双方不能正确通信。
1.3 本课题研究的意义
聊天程序是否加密关系着用户的切身利用。为了保卫公民隐私权不受到网
络黑客的不法侵犯,开发加密传输信息的聊天程序有着重大意义。聊天程序的
加密特性对用户应该是透明的。正如前面分析,如果以安装插件的方式加密聊
天程序很可能造成通信双方加密不一致的情况。因此将加密算法内嵌入聊天程
序可以保证通信双方均能正常通信。
传统的对称加密算法如 DES 虽然可以快速的加密和解密明文,然而其密钥
难以分配和管理。如果让通信双方相互约定密钥显然是不合适的,因此最好的
方式是由一方产生密钥然后传送给另一方。基于公钥的非对称加密体制的引入
正是用于解决对称加密算法在密钥管理上的不足,但是非对称加密算法如 RSA
存在运算强度过大、费时较长等问题。如果直接用于加密聊天程序,其生成密
钥和加密解密所需时间是人们在通信过程中所不能容忍的,采取将两种加密算
法相结合的方式可以很好的解决以上问题,从而达到安全快速的加密数据。
陈繁星 《安全聊天系统的设计与实现》
第 3页 共 32 页
2 所采用技术的先进性分析
2.1 DES 算法
DES 是 Data Encryption Standard(数据加密标准)的缩写。它是由 IBM
公司研制的一种加密算法,美国国家标准局于 1977 年公布把它作为非机要部门
使用的数据加密标准,二十年来,它一直活跃在国际保密通信的舞台上,扮演
了十分重要的角色。
DES 是一个分组加密算法,它以 64 位为分组对数据加密。同时 DES 也是一个对称算
法:加密和解密用的是同一个算法。它的密钥长度是 56 位(因为每个第 8 位都用作奇偶校
验),密钥也可以是任意的 56 位数,而且可以任意时候改变。其中有极少量的数被认为是
弱密钥,但是很容易避开它们。所以保密性依赖于密钥。
2.2 RSA 算法
1978 年,美国麻省理工学院(MIT)的研究小组成员 Ronald L Rivest、Adi
Shamir、 Leonard Adleman 提出了一种基于公开密钥密码体制的优秀加密算法
--RSA 算法。RSA 的取名就是来自这三位发明者姓氏的第一个字母。该算法以
其较高的保密强度逐渐成为一种广为接受的公钥密码体制算法。RSA 算法是一
种分组密码体制算法,它的保密强度是建立在具有大素数因子的合数,其因子
分解 NP(Nondeterministic Polynomial)完全问题这一数学难题的基础上的,
因此 RSA 算法具有很强的保密性。
RSA 算法研制的最初目标是解决 DES 算法秘密密钥利用公开信道传输分发
困难的难题,而实际结果不但很好地解决了这个难题;还可利用 RSA 来完成对
消息的数字签名以防对消息的抵赖;同时还可以利用数字签名发现攻击者对消
息的非法篡改,以保护数据信息的完整性。
RSA 算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。
RSA 是被研究得最广泛的公钥算法,普遍认为是目前最优秀的公钥方案之一。
RSA 得到了世界上的最广泛的应用,并于 1992 年 ISO 国际标准化组织在其颁发
的国际标准 X.509 中,将 RSA 算法正式纳入国际标准。
2.3 线程池
在传统的 UNIX 模型中,当一个进程需要另一个实体来完成某事时,它就
fork 一个子进程并让子进程去执行处理。Unix 上的大多数网络服务器程序就是
这么编写的,父进程 accept 一个连接,fork 一个子进程,该子进程处理与该
连接对端的客户之间的通信。
尽管这种范式多少年来一直良好地服务着,fork 调用却存在一些问题:1
第 4页 共 32 页
fork 是昂贵的。fork 要把父进程的内存映象拷贝到子进程,并在子进程中复制
陈繁星 《安全聊天系统的设计与实现》
所有描述字,如此等等。2 fork 返回之后父进程之间信息的传递需要进程间通
信(IPC)机制。调用 fork 之前父进程向尚存在的子进程传递信息相当容易。
因为子进程将从父进程数据空间及所有描述字的一个拷贝开始运行。然而从子
进程往父进程返回信息却比较费力。
线 程 有 助 于 解 决 这 两 个 问 题。 线 程 有 时 称 为 轻 权 进 程 ( lightweight
process),因为线程比进程“权重轻些”。也就是说,线程的创建可能比进程的
创建快 10~100 倍。
线程池是指在服务器启动阶段预先创建一系列线程阻塞于 accept 调用,每
个客户由当前可用线程池中的某个(闲置)线程处理。这种处理方式比通常的
客户连接到来时临时创建线程为其服务要快得多。可以获得很好的性能加速。
陈繁星 《安全聊天系统的设计与实现》
第 5页 共 32 页
3 系统需求分析
3.1 聊天程序功能分析
1 注册功能
通常聊天程序需要用户名和密码才能使用,所以需要实现 web 注册功能,
这样用户可以很方便的通过 web 网站注册自己的用户名并取得密码,还可以在
服务器上存储个人相关信息以便他人查看。
2 登陆功能
用户在聊天之前需要输入用户名和密码进行登陆以便获取自身相关信息和
好友相关信息,故登陆过程中服务器需对用户名和密码进行必要的核对。
3 聊天功能
这是聊天程序的主要功能。用户之间的相互通信必须及时快速的由服务器
转发。
3.2 加密算法
由于是加密聊天程序,故对聊天明文的加密算法应选取加密速度相对较快
的对称加密算法(如:DES),又由于 DES 的加密密钥是不能公开的秘密密钥,
故对 DES 的密钥应加密传送,所以应采用非对称的公钥加密算法(如 RSA)用
以分发 DES 密钥。
DES 加密算法:
作为对称加密算法中的 DES 加密算法由于其加密过程是固定不变的,故应
考虑其密钥的生成。由于弱密钥存在的可能性,还应该考虑如何避免生成弱密
钥。因为差分分析法的提出可以快速的破解少于 16 轮迭代的 DES 算法,故应保
证其迭代次数至少为 16 轮。
RSA 加密算法:
由于 RSA 是基于大素数因子分解这一数学难题提出的,故 RSA 中公钥和私
钥的产生应重点考虑。又由于 RSA 的运算强度较大,故还应考虑如何加速其运
算速度。
陈繁星 《安全聊天系统的设计与实现》
第 6页 共 32 页
4 系统总体设计和模块划分
4.1 系统总体设计
如图 4.1 所示,本系统采用 C/S 模式。
图 4.1 系统设计
1 用户通过 web 应用程序注册帐号,然后用注册的帐号登陆聊天程序服务
器。
2 客户端产生生成 DES 密钥,服务器端在启动时初始化产生 RSA 公钥和私
钥。当客户端向服务器发起连接时,服务器送出 RSA 公钥,客户端用取得的公
钥加密产生的 DES 私钥回传服务器。
3 最后服务器与客户端双方的通信均由 DES 加密算法加密通信明文。
4.2 模块划分
4.2.1 DES 算法模块
1 加密算法 3 个主要步骤
第一步,初始置换 IP
陈繁星 《安全聊天系统的设计与实现》
第 7页 共 32 页
图 4.2 为初始置换表 IP,64bit 输入明文经过该表完成初始置换。
图 4.2 初始置换表 IP
第二步,16 轮迭代
图 4.3 16 轮迭代
图 4.3 为 DES16 轮迭代,将经过初始置换的数据分成 Li 和 Ri 两部分。将
Ri 直接交换为 Li+1,Li 与 Ri 经过 f 函数处理后的数据相异或得 Ri+1,最后一
轮不做交换。
第三步,逆置换
陈繁星 《安全聊天系统的设计与实现》
第 8页 共 32 页
图 4.4 逆置换表(IP-1)
图 4.4 为逆置换表(IP-1),经过 16 轮迭代后通过该表置换得到输出的密文。
2 子密钥的产生
图 4.5 生成子密钥
图 4.5 为子密钥生成过程,将 64bit 初始密钥经过 PC-1 表置换为 56bit 输
入,分为 Ci, Di 两组分别进行 LS 循环左移,再经过 PC-2 表压缩为 48bit 子密
钥。如此循环 16 轮生成 16 组子密钥。
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)暂时存入