《计算机信息安全》实验指导书Word格式.docx
《《计算机信息安全》实验指导书Word格式.docx》由会员分享,可在线阅读,更多相关《《计算机信息安全》实验指导书Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
(一)、密钥生成
1、生成种子密钥K
使用密钥流生成器生成64位(8个字节)的种子密钥K,每个字节的第8位作为奇偶校验位,不参与实际运算中子密钥的生成过程。
2、生成每一轮迭代中使用的子密钥ki。
(1)根据PC-1置换进行种子密钥K的变换,舍弃64位种子密钥K中的8个奇偶校验位,得到56位的密钥。
(2)将变换后的密钥分为左右两部分各28位,分别称为C0和D0,即PC-1(K)=C0D0。
(3)生成16个子密钥ki,1≤i≤16。
(i)将Ci、Di循环左移1位或2位,根据i值由“循环左移表”决定循环左移的位数,即计算Ci=LSi(Ci-1)和Di=LSi(Di-1),其中,LS表示循环左移。
(ii)将循环左移后的Ci和Di作为一个56位的整体按置换表PC-2进行变换,得到本轮所使用的48位子密钥ki,即ki=PC-2(CiDi)(1≤i≤16)。
(二)、处理64位数据
1、取得64位明文分组数据m,如果数据长度不足64位,应该将其扩展为64
位(例如补零)。
2、将64位明文分组数据m按初始置换表IP进行变换,获得64位的m0,并将
m0分为左右两部分,前面32位记为L0,后面32位记为R0,即m0=IP(m)=L0R0。
3、用16个子密钥ki(1≤i≤16)加密数据。
所用变换公式为:
F(Ri1,Ki)=p_box(S_boxes(Expand(Ri1)Ki))
(1)将32位的Ri-1按扩展置换E扩展成48位;
(2)异或Ri-1和ki;
(3)将异或后的结果分为8个6位长的部分,第1位到第6位称为S[1],第7位到第12位称为S[2],依此类推,第43位到第48位称为S[8];
(4)按S盒的变换原理变换所有的S[j],1≤j≤8。
每一个S盒都是将输入的6位数据经过处理后转换成4位数据输出。
(5)将S[1]到S[8]的输出组合成32位数据,按P置换进行变换,变换的结果就是轮函数F。
(6)异或轮函数F和Li-1,结果就是Ri,即Ri=Li1F(Ri1,Ki)
(7)Li=Ri1
(8)循环执行轮函数F,直到K16被变换完成。
4、第16轮迭代结束后左、右部分各是L16和R16,将左右部分交换,作为64位
的预输出,即L17=R16,R17=L16。
5、将变换后的R16L16按逆初始置换IP-1进行变换得到最后的结果,即为密文,即
c=IP-1(R16L16)。
五实验步骤
本实验为设计型实验,要求学生自己根据实验原理,自行设计实验步骤,利用TurboC2.0或VisualC++6.0编程语言,实现对一个文件进行加密和解密。
六实验结果
七思考题
1、DES算法中大量的置换运算的作用是什么?
2、DES算法中S盒变换的作用是什么?
3、通过查阅相关资料了解目前破解DES算法的基本原理或方法。
实验二公钥密码加密解密实验
1、掌握公钥密码体制的基本概念;
2、掌握公钥密码体制加密/解密的工作原理;
3、重点掌握RSA密码算法加密/解密的基本原理;
4、通过用RSA算法对实际的数据进行加密/解密运算来深刻了解RSA的运行原理。
1、根据RSA密码算法原理,用TurboC2.0或VisualC++6.0设计编写符合RSA密码算法思想的加密/解密程序。
RSA算法基于数论构造,是迄今理论上最为完善的非对称密钥密码算法,它的安全性是建立在“大整数的质因子分解和素性检测”这个数论难题的基础上,即将两个大素数相乘在计算上容易实现,而将该乘积分解为两个大素数因子的计算量则相当大。
1、RSA的密钥产生过程如下:
①选择两个保密的大素数p和q;
②计算n=pq(公开);
φ(n)=(p-1)(q-1)(保密);
③随机选取一个整数e,满足1<e<φ(n)且gcd(φ(n),e)=1(公开);
④计算d,满足ed1(modφ(n))(保密);
说明:
d是e在模φ(n)下的乘法逆元。
因为e与φ(n)互素,所以其乘法逆元一
定存在。
⑤得到一对密钥:
公钥{e,n},私钥{p,q,d}。
2、RSA的加密过程如下:
①明文数字化,即将明文转换成数字串。
②将明文比特串分组,使得每个分组对应的十进制数小于n,即分组长度小于等
于log2n+1。
③设第i个明文分组对应的数字为mi,对mi作加密运算。
即将消息mi以加密指
数e做乘方,并取模n,即:
ci=miemodn(0≤mi<
n)
④最后得到的密文C由所有长度相同的密文分组ci组成。
3、RSA的解密过程如下:
①将密文转换成数字串。
②将以上数字串分段,使得每一段数字均小于n。
③设第i个密文分组对应的数字为ci,对ci作解密运算。
即将明文分组ci以解
密指数d做乘方,并取模n,即:
mi=cidmodn
④最后得到的明文M由所有长度相同的明文分组mi组成。
本实验为设计型实验,要求学生自己根据实验原理,自行设计实验步骤,利用TurboC2.0或VisualC++6.0编程语言,编程实现RSA算法。
编程内容包括:
1、用函数求出1~65535之间的全部素数。
2、用函数生成一对RSA密钥。
3、并利用该程序实现对一个文件进行加密和解密处理。
1、加密运行
2、解密运行
由于int型变量长度为16位,因此n最大只能小于65536。
此程序只是
对RSA算法进行验证,无法实现达到安全要求的数据位数。
1、分析影响RSA密码体制安全的因素。
2、分析比较RSA密钥的长度对加密、解密性能的影响。
实验三Hash函数加密解密实验
1、了解MD5算法的基本原理;
2、熟悉MD5消息摘要算法的编程实现方法;
3、通过用MD5算法对随机产生的数据进行哈希来深刻了解MD5的运行原理。
1、根据MD5算法原理,用TurboC2.0或VisualC++6.0设计编写符合MD5算法思想的消息摘要生成程序。
1、MD5算法的作用是把一个任意长度的消息进行变化产生一个128bit的消息摘
要。
2、MD5算法除了要能够满足完成完整性验证必需的要求外,还要求运算效率要
高。
因此,MD5将消息分成若干个512bit的分组(大块)来处理输入的消息,
且每一个分组又被划分成16个32bit的子分组(子块),经过一系列变换后,
算法的输出由4个32bit分组构成,将这4个32bit分组连接后生成一个
128bit的消息摘要。
3、MD5算法以32位字运算为基础,加密算法有4轮,每一轮要进行16次迭代
运算。
●整个算法分为五个步骤。
步骤1:
增加填充位
在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448,即信息的字节长度扩展至N×
512+448,N为一个正整数。
填充的方法是:
第一位为1,后面各位全为0。
步骤2:
附加消息长度值
然后,再在填充后的报文后面附加一个64位的长度值,该长度值来源于填充前的原始报文长度。
经过上述两步处理,当前报文的比特长度=N×
512+448+64=(N+1)×
512,即长度恰好是512的整数倍。
按照512的长度为单位,将报文分割成Y0,Y1,…YN-1,每一个分组又可以表示成16个32位的字。
步骤3:
初始化MD缓冲区
MD5有A,B,C,D四个32位的寄存器用作缓冲区,它们的初始值分别为A=01234567,B=89abcdef,C=fedcba98,D=76543210。
步骤4:
以512位的分组为单位处理消息
从分组Y0开始,到最后一个分组YN-1,依次进行HMD5压缩运算。
每个HMD5有两个输入(一个是128位的CV0,另一个是512位的分组Yi)和一个128位的输出。
最开始的128位输入为4个32位寄存器的初始值,以后每个HMD5的输出作为下一个128位的输入。
步骤5:
输出
最后一次进行HMD5后输出的128位值,即为所求的消息摘要MD。
如图所示。
D5压缩函数HMD5的处理过程
●HMD5算法
HMD5算法是MD5的关键函数,它是一个4轮循环,如图所示。
HMD5算法
(1)运算一开始,先将4个寄存器的初始值复制到另外4个变量中,
A=a,B=b,C=c,D=d。
(2)注循环右4轮,每一轮结构都很相似。
在每一轮中进行16次迭代操作。
每次
操作对a,b,c,d中的3个做一次非线性函数运算。
然后将所得结果加上第4
个变量以及报文的一个子分组和一个常数T[i]。
再将所得结果循环左移一个
不定的数,并加上a,b,c,d中之一。
即a=b+((a+g(b,c,d)+X[k]+T[i])<
<
S)。
(3)以下是每次操作中用到的4个非线性函数(每轮一个)。
(4)下面为每一轮16次操作中的4次操作,16次操作按照一定顺序进行。
FF(a,b,c,d,M[j],S,T[i])表示a=b+(a+(F(b,c,d)+M[j]+T[i])<
S)
GG(a,b,c,d,M[j],S,T[i])表示a=b+(a+(G(b,c,d)+M[j]+T[i])<
HH(a,b,c,d,M[j],S,T[i])表示a=b+(a+(H(b,c,d)+M[j]+T[i])<
II(a,b,c,d,M[j],S,T[i])表示a=b+(a+(I(b,c,d)+M[j]+T[i])<
这里,“+”定义为mod232的模运算。
M[j]表示在第n个512位数据块的第j个32位子分组,0≤j≤15。
在第i步中,T[i]是32位的随机数源,它消除了输入数据中任何规律性的特征。
本实验为一个设计性实验,要求学生自己根据实验原理,自行设计实验步骤,编程实现MD5算法。
并利用该程序对一个文件或字符串进行处理,计算其Hash值。
六程序清单
1、头文件
typedefstruct{
UINT4state[4];
/*数组state[4]用来存储MD5的四个寄存器A,B,C,D值*/
UINT4count[2];
/*count[0]用来记录已经处理过的位数,count[1]用来记录已经处理
过的字节数*/
unsignedcharbuffer[64];
/*buffer作为输入过程中的缓存*/
}MD5_CTX;
2、主循环
/*MD5的四个基本逻辑函数F,G,H,I*/
#defineF(x,y,z)(((x)&
(y))|((~x)&
(z)))
#defineG(x,y,z)(((x)&
(z))|((y)&
(~z)))
#defineH(x,y,z)((x)^(y)^(z))
#defineI(x,y,z)((y)^((x)|(~z)))
/*第一轮中每一次迭代运算所输入的内容由函数FF表示*/
#defineFF(a,b,c,d,x,s,ac){\
(a)+=F((b),(c),(d))+(x)+(UINT4)(ac);
\
(a)=ROTATE_LEFT((a),(s));
(a)+=(b);
}
/*第二轮中每一次迭代运算所输入的内容由函数GG表示*/
#defineGG(a,b,c,d,x,s,ac){\
(a)+=G((b),(c),(d))+(x)+(UINT4)(ac);
}
/*第三轮中每一次迭代运算所输入的内容由函数HH表示*/
#defineHH(a,b,c,d,x,s,ac){\
(a)+=H((b),(c),(d))+(x)+(UINT4)(ac);
/*第四轮中每一次迭代运算所输入的内容由函数II表示*/
#defineII(a,b,c,d,x,s,ac){\
(a)+=I((b),(c),(d))+(x)+(UINT4)(ac);
voidMD5Init(MD5_CTX*context)//初始化函数,context是一个结构体变量
{
context->
count[0]=context->
count[1]=0;
state[0]=0x67452301;
state[1]=0xefcdab89;
state[2]=0x98badcfe;
state[3]=0x10325476;
}
voidMD5Update(MD5_CTX*context,unsignedchar*input,unsignedintinputLen)
{//MD5块处理函数
unsignedinti,index,partLen;
index=(unsignedint)((context->
count[0]>
>
3)&
0x3F);
if((context->
count[0]+=((UINT4)inputLen<
3))<
((UINT4)inputLen<
3))
count[1]++;
count[1]+=((UINT4)inputLen>
29);
partLen=64-index;
if(inputLen>
=partLen)
{
MD5_memcpy((POINTER)&
context->
buffer[index],(POINTER)input,partLen);
MD5Transform(context->
state,context->
buffer);
for(i=partLen;
i+63<
inputLen;
i+=64)
state,&
input[i]);
index=0;
else
i=0;
buffer[index],(POINTER)&
input[i],inputLen-i);
voidMD5Final(unsignedchardigest[16],MD5_CTX*context)
{/*完成函数,context指向上面处理过的结构体,digest[16]是用来存储结果的缓冲区
这个函数对未完成的信息先进行填充,然后处理,并把最终结果存储在digest[16]中*/
unsignedcharbits[8];
unsignedintindex,padLen;
Encode(bits,context->
count,8);
0x3f);
padLen=(index<
56)?
(56-index):
(120-index);
MD5Update(context,PADDING,padLen);
MD5Update(context,bits,8);
Encode(digest,context->
state,16);
MD5_memset((POINTER)context,0,sizeof(*context));
3、主函数
#include"
md5.c"
#include<
stdio.h>
time.h>
stdlib.h>
#defineRAND_MAX0x7fff
voidmain(void)
unsignedchar*inputData;
char*inp=(char*)malloc(sizeof(char)*1024);
inputData=(unsignedchar*)inp;
unsignedchar*hashstr;
inti,x;
time_tt;
//这两行保证每次产生的随机数不同
intlen;
srand((unsigned)time(&
t));
len=rand()*200/RAND_MAX;
inp[len]='
\0'
;
for(i=0;
i<
len;
i++)
x=rand()*16/RAND_MAX;
if(x<
10)
inp[i]=48+x;
elseif(x>
9&
&
x<
16)
inp[i]=65+x-10;
printf("
明文字符串是:
%s\n\n"
inp);
if((hashstr=(unsignedchar*)malloc(17))==NULL)
printf("
Notenoughmemorytoallocatebuffer\n"
);
exit
(1);
//terminateprogramifoutofmemory
MD5String(inputData,hashstr);
//调用MD5算法实现函数
明文经过MD5得到的消息摘要是:
%s\n"
hashstr);
七实验结果
由于在程序中使用了语句inti,x;
和time_tt;
,保证了每次产生的明文信息均不同,故经过MD5算法运算,得到的消息摘要MD(x)也是不相同的。
八思考题
1、简述消息认证码MAC的基本原理。
2、分析MAC与消息摘要的区别。
实验四软件安全实验
计算机系统漏洞扫描器是一种自动检测远程或本地主机安全性弱点的程序。
通过使用漏洞扫描器,系统管理员能够发现所维护的Web服务器的各种TCP端口的分配、提供的服务、Web服务软件版本和这些服务及软件呈现在Internet上的安全漏洞,从而及时修补漏洞,保障计算机系统的安全。
1、了解目前系统存在的典型漏洞。
2、学会使用网络扫描和漏洞扫描工具。
3、掌握涉及网络安全所采取的防范措施。
本次试验所选择的流光漏洞扫描软件不仅仅是操作系统漏洞扫描工具,还是一个功能强大的渗透测试工具。
流光自带了猜解器和入侵工具,可以方便地利用扫描出的漏洞进行入侵。
通过试验,需要掌握流光漏洞扫描软件的使用。
2、两台预装Windows2000/XP的计算机,通过网络相连,其中一台计算机安装Fluxzy5(流光5)。
计算机系统漏洞扫描技术的工作原理是:
首先,要获得计算机系统在网络服务、版本信息、Web应用等相关信息,采用模拟攻击的方法,对目标主机系统进行攻击性的安全漏洞扫描。
如:
弱口令测试等。
如果模拟攻击成功,则视为系统存在漏洞。
其次,也可以根据系统事先定义的系统安全漏洞库对可能存在的、已知的安全漏洞进行逐项检查,按照规则匹配的原则将扫描结果与安全漏洞库进行比对,如果满足匹配条件,则视为系统存在漏洞。
最后,根据检测结果向系统管理员提供安全性分析报告,作为系统和网络安全整体水平的评估依据。
1、安装流光软件
在安装流光时,需要关闭本地的病毒防火墙。
启动流光工具后可以看到主界
面如图4-1所示。
图4-1流光工具启动界面
2、选择【文件】→【高级扫描向导】命令,打开【设置】对话框,图4-2所示。
图4-2高级扫描向导设置
3、在该对话框中的【起始地址】和【结束地址】文本框中填写本地IP地址,【目
标系统】下拉列表框可以选择ALL/Windows/Linux/UNIX,【检测项目】列表
框选择对目标主机的哪些服务进行漏洞扫描,单击【下一步】按钮,打开
【PORTS】对话框,如图4-3所示。
图4-3端口设置
4、通过图4-3所示对话框可以对扫描的端口进行设置,其中自定义端口扫描范
围为0~65535。
对于本次试验,选中【标准端口扫描】复选框,并单击【下
一步】按钮,将打开尝试获取POP3的版本信息和用户密码的对话框以及获取
FTP的Banner、尝试匿名登录、尝试用简单字典对FTP账号进行暴力破解的
对话框。
选择这3项后单击【下一步】按钮,将弹出询问获取SMTP、IMAP
和操作系统版本信息以及用户信息的提示,并询问是否扫描Sun
OS/bin/login远程溢出的对话框。
5、之后,将出现扫描Web漏洞的信息,对按照事先定义的CGI漏洞列