④最后得到的密文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函数加密解密实验
实验学时:
2学时
实验类型:
设计
实验要求:
必修
一实验目的
1、了解MD5算法的基本原理;
2、熟悉MD5消息摘要算法的编程实现方法;
3、通过用MD5算法对随机产生的数据进行哈希来深刻了解MD5的运行原理。
二实验内容
1、根据MD5算法原理,用TurboC2.0或VisualC++6.0设计编写符合MD5算法思想的消息摘要生成程序。
三实验环境
1、操作系统:
Windows9x/NT/2000/XP
2、编程软件:
TurboC2.0或VisualC++6.0
四实验原理
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])<<
(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])<<
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);\
(a)=ROTATE_LEFT((a),(s));\
(a)+=(b);\
}
/*第三轮中每一次迭代运算所输入的内容由函数HH表示*/
#defineHH(a,b,c,d,x,s,ac){\
(a)+=H((b),(c),(d))+(x)+(UINT4)(ac);\
(a)=ROTATE_LEFT((a),(s));\
(a)+=(b);\
}
/*第四轮中每一次迭代运算所输入的内容由函数II表示*/
#defineII(a,b,c,d,x,s,ac){\
(a)+=I((b),(c),(d))+(x)+(UINT4)(ac);\
(a)=ROTATE_LEFT((a),(s));\
(a)+=(b);\
}
voidMD5Init(MD5_CTX*context)//初始化函数,context是一个结构体变量
{
context->count[0]=context->count[1]=0;
context->state[0]=0x67452301;
context->state[1]=0xefcdab89;
context->state[2]=0x98badcfe;
context->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))
context->count[1]++;
context->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+63MD5Transform(context->state,&input[i]);
index=0;
}
else
i=0;
MD5_memcpy((POINTER)&context->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);
index=(unsignedint)((context->count[0]>>3)&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
#include
#include
#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{
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算法实现函数
printf("明文经过MD5得到的消息摘要是:
%s\n",hashstr);
}
七实验结果
由于在程序中使用了语句inti,x;和time_tt;,保证了每次产生的明文信息均不同,故经过MD5算法运算,得到的消息摘要MD(x)也是不相同的。
八思考题
1、简述消息认证码MAC的基本原理。
2、分析MAC与消息摘要的区别。
实验四软件安全实验
实验学时:
2学时
实验类型:
设计
实验要求:
必修
一实验目的
计算机系统漏洞扫描器是一种自动检测远程或本地主机安全性弱点的程序。
通过使用漏洞扫描器,系统管理员能够发现所维护的Web服务器的各种TCP端口的分配、提供的服务、Web服务软件版本和这些服务及软件呈现在Internet上的安全漏洞,从而及时修补漏洞,保障计算机系统的安全。
1、了解目前系统存在的典型漏洞。
2、学会使用网络扫描和漏洞扫描工具。
3、掌握涉及网络安全所采取的防范措施。
二实验内容
本次试验所选择的流光漏洞扫描软件不仅仅是操作系统漏洞扫描工具,还是一个功能强大的渗透测试工具。
流光自带了猜解器和入侵工具,可以方便地利用扫描出的漏洞进行入侵。
通过试验,需要掌握流光漏洞扫描软件的使用。
三实验环境
1、操作系统:
Windows9x/NT/2000/XP
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漏洞列