1、聊天程序具体模块实现分析摘要: 随着网络的迅速发展,人们交流的方式也受到网络的巨大影响。越来越多的人们选择了网络聊天,通常聊天程序的主要系统主要包括以下四个模块:聊天程序模块、保密性模块、完整性模块、防抵赖模块。详细介绍了聊天程序的具体模块实现过程。 关键词: 聊天程序;模块;实现 中图分类号:TB 文献标识码:A 文章编号:16723198(2013)02018602 0 引言 VC+6.0 为 Windows 环境下的网络考法提供了强大的工具,而其中的Csocket 控件就是其中之一。某聊天程序就是利用 Csocket 控件实现聊天程序的,它使得程序的实现变得相对简单。通常聊天程序分为四大
2、模块:聊天工具模块、保密性模块、完整性模块和防抵赖模块,以下详细介绍了这四大模块的具体实现过程。 1 聊天工具模块的实现 某聊天程序是建立在 UDP 的基础之上的,完成与远程计算机的通信,它通过与现在内部封装了所有的技术细节,并提供访问 UDP 网络服务的方便途径。只需要设置控件的属性并调用其方法就可以轻易实现与远程计算机的连接,并且可以实现双向的交换数据,而且不需要了解 UDP 的细节或者调用低级的 Winsock API。 此程序运行过程如下:在进行聊天的数据传输前(也就是广播) ,服务期先运行,等待客户端连接。客户端运行后首先要连接到服务器,输入服务器的 IP 地址和连接的端口号(本程序
3、默认为:4000)后开始连接。如成功会响应连接成功,反之响应连接失败,而后客户端皆可以后到广播的消息了。在服务器一端,没有以客户连接服务器,服务器上就会监听即提示相关信息,议题是由客户连接。服务器输入要广播的内容后就可以发送了,所有连接到服务器上的客户都会接收到信息。下面分别对于各个类、成员函数和响应函数进行介绍。 CMessag 类主要是用于封装消息的,目的是重载 Serialize()函数对 CArchive 对象进行串行化,CArchive 对象存储着接收到和将要发送的数据,因此,CMessag 类也就是对聊天内容进行封装的,而串行化便于接受和发送的。 自定义类 CserverSocke
4、t,在 ClassView 视图中右键单击“ChatDemo Classes”,选择“New Class”,弹出的“New Class”对话框。 “Class Type”为 MFC class, “Name”为 CServerSocket, “Base Class”为CSocket,单击“OK”完成添加。CServerSocket 类主要是用于重载CSocket 类中 OnAccept 函数,负责接受客户端的连接。在此函数调用主对话框类的 ProcessPendingAccpt 函数处理连接请求。 在主对话框类中的几个主要的成员函数: ProcessPendingAccept()函数:在 CS
5、ocket 子类的 OnReceive 函数中被调用,起作用是对接收到的对方的连接请求进行处理; ClearContent()函数:用于清空变量,包括 Socket 对象和聊天数据; CloseSessionSocket()函数:用于关闭服务器和客户端会话的Socket 连接。 控件的消息响应函数。 2 保密性模块的实现 DES 程序是通过宏定义可选择小代码模式后者选择大打代码模式。在大代码模式下,程序定义了多个表,从而使 DES 算法中的很多运算都可以通过查表实现,速度较快,但要求有较多的存储空间;在小代码模式下,可以不查表,从而节省了存储空间,但是速度较慢。DES 算法主要是在工程中 yx
6、yDES.h 和 yxyDES.cpp 两个文件,下面主要简单介绍下其主要的几个函数。 加密解密时主要用到下面 5 个函数: int des_setup(congest unsight char *key,int keylen,int num_rounds,des_key *skey) 函数名:密钥生成函数 功能描述:当密钥生成时,返回值为 CRYPT_OK(0) ,结果保留在skey 指向的结构体。结构体中的 ck 存储加密时用的子密钥,dk_存储解密时用的子密钥。结构体中用的 2 个 32 位整数来存储一轮 48 位密钥,每一个 32 位整数被分成 4 个 8 位,每个 8 位的第 6 位
7、存储密钥。如果把48 位密钥分成 8 组,则这 8 组按存储的顺序从高到低为1、3、5、7、2、4、6、8。这样做是为了加密时可以把扩展和查表运算结合进行。 void des_ecb_ebcrypt(const unsigned char *pt,unsight char *ct,des_key *key) 函数名:加密函数。 功能描述:主要是是对明文进行加密,加密成功时,返回CRYPT_OK。 Void des_ecb_decrypt(const unsigned char *ct,unsigned char *pt,des_key *key) 函数名:解密函数。 功能描述:主要是对密文进行
8、解密,解密成功时,返回 CRYPT_OK。 int des_test(void) 函数名:测试函数。 功能描述:这个函数用来对加密算法进行测试。函数体内部定义了对应的明文和密文数组,并且进行了多轮加密和解密。 int des_keysize(int *desired_keysize) 函数名:密钥长度检验函数。 功能描述:初始化密钥的长度,对其进行检验。当密钥长度小于密钥长度时,返回值 CRYPT_INVALID_KEYSIZE,否则,desired_keysize 指向的变量被置为 8。 3 完整性模块的实现 在完整性模块中,主要是采用的 MD5 加密算法,主要是工程文件中的 MD5.h 和
9、 MD5.h 两个文件中。下面简单的介绍用到的结构体变量和函数程序中用到的结构体变量和程序用到的函数如下: void md5_init(md5_state *md) 函数名:初始化函数 功能描述:主要是初始化 md5 算法,在程序中使用的“12345678”初试化的。 int md5_process(md5_state *md,const unsigned char *buf,unsigned long len) 函数名:处理函数 功能描述:这个函数对待处理的信息以 512 位为单位进行压缩,不足的部分存储在结构体的 buf 中,并且 len 来标识信息的末尾,这样下次调用时会接着上一次的结果
10、进行。 int md5_done(md5_state *md,unsigned char *Hash) 函数名:完成函数 功能描述:这个函数对未完成的信息先进行 padding 操作,然后处理,并把最终结果存在 Hash 指向的缓冲区中。 int md5_test(void) 函数名:测试函数 功能描述:这个函数对上面的 3 个函数进行测试。函数内部定义了一组信息和 Hash 结果一一对应的数组。通过调用上面的 3 个函数,并把结果和正确的结果相比较,可以判断程序正确与否,这个函数主要在模块的调试中很重要。 4 防抵赖模块的实现 主要是利用数字签名技术实现的,在这里主要是介绍 RSA 算法中相
11、关函数以及使用到的类,完成 RSA 算法主要是工程文件的 bigint.h 和rsa.h 两个文件实现的。主要用的函数如下: bool small_prime_test(bigint) 函数名:2000 以内小素数检验 功能描述:用于判断是否是 2000 以内的小素数。 bigint get_prime(void) 函数名:Rabin-Miller 素性检验 功能描述:主要是检测随机生成的数是否满足,且检验次数达到ROUND 次才算通过检验。 bigint get_random() 函数名:获得随机数 功能描述:主要是生成 p,q,e 时调用,随机生成大素数。 bigint qmod(bigi
12、nt a,bigint b,bigint c) 函数名:快速模乘 功能描述:主要是在加密和解密时调用,计算一个数模乘。 void Encryption(bigint e,bigint N) 函数名:加密函数 功能描述:完成对明文 M 的加密,生成密文 C,并且将密文存在miwen.txt 文档中。 void Decryption(bigint d,bigint N) 函数名:解密函数 功能描述:完成对密文 C 的解密,生成明文 M,并且将明文存在文档ingwen.txt 中。 5 结束语 本文主要就具体的程序的设计进行的实现,包括相应的结构体和函数等。然而,在实际程序的设计中很多的工程文件,涉及很多的功能函数和很多的结构体以及聊天程序的个性化设计。 参考文献 1刘晓敏.厦门卫视非编网络安全设计与实现D.上海:上海交通大学,2008. 2邓奇强.网络安全技术及其发展趋势J.怀化学院学报,2005, (4). 3李彦旭,巴大志,成立.网络信息安全技术综述J.半导体技术,2002, (10).