网络安全课设报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《网络安全技术》
课程设计报告
姓名:江君君班号:193082 学号:_20081001073 组长:江君君院(系):计算机学院专业:网络工程指导教师:姚宏职称:副教授
2011 年7 月
独立工作成果声明
本人声明所呈交的《网络安全技术课程设计》报告,是我个人在导师指导下进行的程序编制工作及取得的成果。

尽我所知,除文中已经标明的引用内容,和已经标明的他人工作外,本报告未包含任何抄袭自他人的工作成果。

对本报告的工作做出贡献的个人,均已在文中以明确方式标明。

本人完全意识到本声明的法律结果由本人承担。

报告作者签名:
日期:年月日
目录
第一章需求分析 (1)
§1.1引言 (1)
§1.2需求分析 (1)
§1.3任务目标 (2)
第二章概要设计 (3)
§2.1 PKI系统时序图 (3)
§2.2接口设计 (3)
第三章详细设计 (5)
§3.1 CA的逻辑处理过程 (5)
§3.2客户端的处理逻辑 (6)
§3.3 界面设计 (7)
第四章编码实现 (8)
§4.1主要的类和证书设计 (8)
§4.2 CA端的逻辑实现 (9)
第五章测试运行 (12)
第六章课程设计感想 (16)
第一章需求分析
§1.1引言
1.1.1项目简要介绍
项目主要实现用户之间和用户与认证中心CA之间的身份认证,他们信息交互中数据保密、完整性验证。

用户之间数据通信的不可抵赖等功能。

1.1.2项目背景
PKI(Public Key Infrastructure)是一个用公钥概念与技术来实施和提供安全服务的具有普适性的安全基础设施。

PKI公钥基础设施的主要任务是在开放环境中为开放性业务提供数字签名服务。

PKI提供的基本服务有认证,完整性验证,保密,不可否认。

§1.2需求分析
1.2.1功能需求
PKI功能主要有以下几点:
◆证书与CA认证中心,证书库,CRL等基本证书管理功能。

◆密钥分发
◆交叉验证
◆加密密钥和签名密钥分隔
◆支持数字签名的不可抵赖性
◆密钥历史管理
由于时间有限,我们只实现以下功能:
证书申请,证书发放,证书交换,数字签名,完整性检查,身份认证,保密通信1.2.2性能需求
用户能够方便地使用加密、数字签名等安全服务。

一个完整的PKI必须提供良好的应用接口系统,使得各种各样的应用能够以安全、一致、可信的方式与PKI进行交互,确保所建立的网络环境的可信性,同时降低管理维护成本。

1.2.2用户需求
要求具有友好的图形界面,便于与用户进行交互。

§1.3任务目标
构建一个CA证书发放,认证与管理中心,若干Client ,Client可以在CA处获得证书,Client之间可以通过获得的证书进行安全的信息通信,通过数字签名验证数据是否为通信对方所发送而的,也可以验证通信信息的完整性。

该项目主要组件及组件间联系如下图:
图1-1 系统逻辑结构图
第二章概要设计
§2.1 PKI系统时序图(以两个客户机为例)
图2-1 系统时序图
说明:图中的方框表示报文,方框内的序号表示报文编号
§2.2接口设计
2.2.1报文结构设计
1号报文的结构如下(经用CA的私钥解密后):
字段一:客户机的IP点分十进制表示,字符串类型,占12个字节;
字段二:客户机的公钥,e=65537,n最长为50位(十进制),占50个字节;
证书申请报文用CA的公钥加密再传给CA
2号报文的格式如下:
字段一:序列号,用长整型表示
字段二:签名算法,用字符串类型表示//RSA
字段三:颁发者(CA的点分十进制表示的IP),用字符串类型表示
字段四:证书主体IP
字段五:公钥,e=65537,n选择为256bits(约等于80位的十进制数),用字符串表示字段六:CA的数字签名(先对前面四个字段做HASH,再用CA的私钥对HASH签名)3号和4号报文的格式和2号一样
5号报文的格式如下(经解密后):
字段一:会话密钥,56bits,最后填充成64bits;
字段二:用A的私钥对会话密钥的签名;
6号报文的格式如下(经解密后):
字段一:响应消息明文;
字段二:用B的私钥对响应消息的签名;
7号报文的格式如下:
字段一:用DES加密的密文;
2.2.2对各种报文的处理
首先对7种报文分别编号,在将报文发送出去时将相应的编号加在报文前面,当通信对端收到报文后通过判断最前面的编号,进行相应的消息响应。

第三章详细设计§3.1 CA的逻辑处理过程:
图3-1 CA端的流程图
§3.2客户端的处理逻辑
图3-2 客户端的流程图
§3.3 界面设计
图3-3 CA端的界面
图3-4 客户端的界面
第四章编码实现
§4.1主要的类和证书设计
设计RSA类如下:
class RSA
{
public:
BigNum RandBigNum(int len /*指定大数的位数*/);//产生大数
bool RabinMiler(BigNum n); //Rabin-Miler算法判断一个大数是否是素数
bool IsPrime(BigNum n);//判断n是不是素数,重复10次Rabin Miler算法
BigNum Gcb(BigNum a,BigNum b); //求大数a,b的最大公约数
bool IsTheyPrimy(BigNum p,BigNum q);//判断两个大数是否互素
//输入字符串,将其转换成大数
char* GetBigNumFromString(char* input,int n,char* output);
//输入大数,输出字符串,n为input的长度
char* GetStringFromBigNum(char* input,int n,char* output);
char* RSAEncrypt(char* input,BigNum e,BigNum n,char* output);//RSA加密
char* RSADecrypt(char* input,BigNum d,BigNum n,char* output);//RSA解密
BigNum ProduceBigPrime(int len);//产生len位的大素数
};
其中BigNum类封装了所有的大数操作,设计如下:
class BigNum //大数类
{
private:
int m_ilength; //十进制整数的长度
int m_iflag; //标记
int m_isign; //符号位,1负0正public:
char m_szNum[LEN]; //整数的主体
BigNum(); //构造函数
BigNum ABS(); //求绝对值
bool reverse(); //逆置函数
int cmp(BigNum &BN); //内置比较函数
BigNum operator +(BigNum &BN); //重载加法运算
BigNum operator -(BigNum &BN); //重载减法运算
BigNum operator *(BigNum &BN); //重载乘法运算
BigNum operator /(BigNum &BN); //重载除法运算
BigNum operator %(BigNum &BN); //重载求模运算
int operator > (BigNum &BN); //重载大于运算
int operator >= (BigNum &BN); //重载大于等于运算
int operator < (BigNum &BN); //重载小于运算
int operator <= (BigNum &BN); //重载小于等于运算
int operator == (BigNum &BN); //重载等于运算
int operator != (BigNum &BN); //重载不等于运算
bool operator =(char str[]); //输入函数,重载等于操作符bool CinBigNum(char str[]); //输入函数
void CoutBigNum(); //输出函数
static BigNum NiY(BigNum a,BigNum m);//求逆元函数
static BigNum MP(BigNum p1,BigNum q1,BigNum m1);//模平方
};
证书结构体设计如下:
typedef struct
{
char cer_num[10]; //证书序列号
char suanfa[6]; //加密算法
char ca_ip[16]; //CA的IP,CA的唯一标识
char subject_ip[16];//证书主体IP,标识证书主体
char e[6]; //证书主体的公钥e
char n[50]; //证书主体的公钥n
char sig[200]; //CA对证书的签名
}CERTIFICATE;
§4.2 CA端的逻辑实现
UINT ThreadFunc(LPVOID lParam)//线程函数
{
CCADlg* pCADlg=(CCADlg*)lParam;
CSocket sockSrvr;
sockSrvr.Create(6000);
sockSrvr.Listen(5);
CSocket sockRecv;
int cer_number=1;//证书编号
char Msg_buf[1024];//接收报文的缓冲区,密文
while(1)
{
pCADlg->m_listMsg.AddString("正在侦听客户端请求...");
if(!sockSrvr.Accept(sockRecv))
{
AfxMessageBox("accept failed!");
return 0;
}
memset(Msg_buf,0,1024);
sockRecv.Receive(Msg_buf,1024);
pCADlg->m_listMsg.AddString("收到密文:");
pCADlg->m_listMsg.AddString(Msg_buf);
//解密
char plainText[1024];
memset(plainText,0,1024);
RSA rsa;
rsa.RSADecrypt(Msg_buf,pCADlg->m_d,pCADlg->m_n,plainText);
switch(plainText[0])
{
case '1'://证书申请报文
{
//拆包
char ip[16];
memset(ip,0,16);
for(int i=1;i<=12;i++)ip[i-1]=plainText[i];
char e[6];
memset(e,0,6);
for(int j=13;j<=17;j++)e[j-13]=plainText[j];
char n[50];
memset(n,0,50);
for(int k=18;k<strlen(plainText);k++)n[k-18]=plainText[k];
pCADlg->m_listMsg.AddString("解密后,为证书申请,详细信息如下:");
CString str;
str.Format("申请者:%s",ip);
pCADlg->m_listMsg.AddString(str);
str.Format("申请者公钥:e=%s,n=%s",e,n);
pCADlg->m_listMsg.AddString(str);
//发放证书
//先构造证书
char number[10];
memset(number,0,10);
_itoa(cer_number,number,10);//填充序列号
CERTIFICATE cer;
memset(&cer,0,sizeof(cer));
strcpy(cer.cer_num,number);//序列号
strcpy(cer.suanfa,"RSA");//主体IP
strcpy(cer.ca_ip,pCADlg->m_myip);
strcpy(cer.subject_ip,ip);
strcpy(cer.e,e);
strcpy(cer.n,n);
//做MD5签名
char buf[300];
memset(buf,0,300);
strcat(buf,cer.cer_num);
strcat(buf,cer.suanfa);
strcat(buf,cer.ca_ip);
strcat(buf,cer.subject_ip);
strcat(buf,cer.e);
strcat(buf,cer.n);
//做MD5运算
MD5 md5;
md5.reset();
md5.update(buf);
string m_md5=md5.toString();
CString str2=m_md5.c_str();
char* hash=str2.GetBuffer(32);
//用CA的私钥对hash签名
rsa.RSAEncrypt(hash,pCADlg->m_d,pCADlg->m_n,cer.sig);
//发证书
sockRecv.Send(&cer,sizeof(cer));
str.Format("已发放证书,证书序列号为:%d",cer_number);
pCADlg->m_listMsg.AddString(str);
cer_number++;
}
break;
}
sockRecv.Close();
}
sockSrvr.Close();
return 0;
}
由于客户端的处理逻辑比较复杂,代码较多,这里就不再粘贴,如需要可参看程序。

第五章测试运行1.首先运行CA,打开侦听:
2. 运行Client 1,生成公私钥对:
3. 运行Client 2,生成公私钥对:
4. Client 1向CA发送证书申请,收到的证书如下:
5.Client 2向CA申请证书,收到的证书如下:
6. CA端的结果如下:
7. 接着Client 1将自己的证书发布给Client 2,结果如下:
8. Client 1收到Client 2返回的证书后,将会话密钥发送给Client 2:,结果如下:
9. Client 1收到Client 2的响应后,即可与Client 2进行保密通信了,在编辑框中输入消息:
点击[发送]按钮,Client 2收到Client 1发送的加密消息:
10. Client 2也发送一个消息给Client 1,如下:
11. Client 1收到了来自Client 2的消息,如下:
第六章课程设计感想
通过本次网络安全课程设计,我不仅加深了对RSA加密算法和PKI的理解,更学会了如何做系统设计。

作为我们小组的组长,从需求分析、概要设计,到详细设计,再到编码实现,每一步我都是全程参与和主导的。

在做设计之前,首先分析系统要完成的功能,然后确定系统各个组件的时序关系,画出时序图。

在时序图中,牵涉到各种消息报文,所以要对各种报文格式做设计,以便系统能识别和理解各种报文,以做相应的处理。

而详细设计中,就需要根据不同的消息,定义相应的处理方式。

详细设计之后,就开始要动手coding了。

首先,我用MFC做了CA和Client的界面,将整个程序的框架搭建起来,然后做任务细分,使组内的每一个成员都有事可做,同时各任务相互独立,互不影响,以避免某一任务的延期而导致项目不能向前推进。

在整个项目中,最难的部分要数RSA的实现,而RSA的实现中最核心的问题是大数的运算如何实现以及如何快速产生大素数。

通过参阅相关资料和反复思考,第一个问题最后采用模拟自然数运算的思想,用C语言将它实现了,并将各种大数运算都封装到一个类中,以便以后可以复用。

对于第二个问题,没有找到非常高效的算法,最后是采用了“先随机产生——再筛选——再递增”的思想,凭借计算机强大的运算能力,该算法的效率还算可以。

将核心问题解决之后,后面的进度就快多了,最后我们小组圆满地完成了课程设计的任务。

当然学习是无止境的,通过这小小的一个项目对于掌握一门强大的开发语言和算法思想以及系统设计方法是远远不够的。

做得越多,发现自身存在的问题也越多,在很多方面的研究都还不深入,尤其是算法方面。

在以后的学习和实践中我还有很多地方需要完善。

相关文档
最新文档