资源描述
《计算机信息安全》实验指导书
实验一 对称密钥密码加密解密实验
实验学时:2学时
实验类型:设计
实验要求:必修
一 实验目的
1、掌握对称密钥密码体制的基本概念;
2、掌握对称密钥密码体制加密/解密的工作原理;
3、重点掌握DES密码算法加密/解密的基本原理;
4、通过用DES算法对实际的数据进行加密/解密运算来深刻了解DES的运行原理。
二 实验内容
1、根据DES密码算法原理,用Turbo C2.0或Visual C++6.0设计编写符合DES密码算法思想的加密/解密程序。
三 实验环境
1、操作系统:Windows9x/NT/2000/XP
2、编程软件:Turbo C2.0或Visual C++6.0
四 实验原理
1、 DES算法工作的基本原理:DES是基于Feistel密码结构的分组密码,其
入口参数有三个:key、data、mode。 其中,key为加密/解密时使用的
密钥;data为加密/解密的数据;mode为其工作模式:当模式为加密模
式时,明文按照64位进行分组,形成明文分组,此时key用于对数据
加密;当模式为解密模式时,key用于对64位的密文分组进行解密,以
恢复明文。
2、DES算法共进行16轮迭代操作,每轮中都使用相同的轮函数F,如下:
F(Ri-1,Ki)=p_box(S_boxes(Expand(Ri-1) Å Ki))
整个算法的流程如图所示:
DES加密算法流程图
(一)、密钥生成
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(Ri-1,Ki)=p_box(S_boxes(Expand(Ri-1) Å 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=Li-1 Å F(Ri-1,Ki)
(7) Li=Ri-1
(8) 循环执行轮函数F,直到K16被变换完成。
4、 第16轮迭代结束后左、右部分各是L16和R16,将左右部分交换,作为64位
的预输出,即L17=R16,R17=L16。
5、 将变换后的R16L16按逆初始置换IP-1进行变换得到最后的结果,即为密文,即
c=IP-1(R16L16)。
五 实验步骤
本实验为设计型实验,要求学生自己根据实验原理,自行设计实验步骤,利用Turbo C2.0或Visual C++6.0编程语言,实现对一个文件进行加密和解密。
六 实验结果
七 思考题
1、 DES算法中大量的置换运算的作用是什么?
2、 DES算法中S盒变换的作用是什么?
3、 通过查阅相关资料了解目前破解DES算法的基本原理或方法。
实验二 公钥密码加密解密实验
实验学时:2学时
实验类型:设计
实验要求:必修
一 实验目的
1、掌握公钥密码体制的基本概念;
2、掌握公钥密码体制加密/解密的工作原理;
3、重点掌握RSA密码算法加密/解密的基本原理;
4、通过用RSA算法对实际的数据进行加密/解密运算来深刻了解RSA的运行原理。
二 实验内容
1、根据RSA密码算法原理,用Turbo C2.0或Visual C++6.0设计编写符合RSA密码算法思想的加密/解密程序。
三 实验环境
1、操作系统:Windows9x/NT/2000/XP
2、编程软件:Turbo C2.0或Visual C++6.0
四 实验原理
RSA算法基于数论构造,是迄今理论上最为完善的非对称密钥密码算法,它的安全性是建立在“大整数的质因子分解和素性检测”这个数论难题的基础上,即将两个大素数相乘在计算上容易实现,而将该乘积分解为两个大素数因子的计算量则相当大。
1、 RSA的密钥产生过程如下:
①选择两个保密的大素数p和q;
②计算n=pq(公开);φ(n)=(p-1)(q-1)(保密);
③随机选取一个整数e,满足1<e<φ(n)且gcd(φ(n),e)=1(公开);
④计算d,满足edº1(mod φ(n))(保密);
说明:d是e在模φ(n)下的乘法逆元。因为e与φ(n)互素,所以其乘法逆元一
定存在。
⑤得到一对密钥:公钥{e,n},私钥{p,q,d}。
2、 RSA的加密过程如下:
①明文数字化,即将明文转换成数字串。
②将明文比特串分组,使得每个分组对应的十进制数小于n,即分组长度小于等
于log2n+1。
③设第i个明文分组对应的数字为mi,对mi作加密运算。即将消息mi以加密指
数e做乘方,并取模n,即:ci=mie mod n (0≤mi<n)
④最后得到的密文C由所有长度相同的密文分组ci组成。
3、 RSA的解密过程如下:
①将密文转换成数字串。
②将以上数字串分段,使得每一段数字均小于n。
③设第i个密文分组对应的数字为ci,对ci作解密运算。即将明文分组ci以解
密指数d做乘方,并取模n,即: mi=cid mod n
④最后得到的明文M由所有长度相同的明文分组mi组成。
五 实验步骤
本实验为设计型实验,要求学生自己根据实验原理,自行设计实验步骤,利用Turbo C2.0或Visual C++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算法原理,用Turbo C2.0或Visual C++6.0设计编写符合MD5算法思想的消息摘要生成程序。
三 实验环境
1、操作系统:Windows9x/NT/2000/XP
2、编程软件:Turbo C2.0或Visual C++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=01 23 45 67,B=89 ab cd ef,C=fe dc ba 98,D=76 54 32 10。
步骤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])<<<S)
HH(a,b,c,d,M[j],S,T[i])表示a=b+(a+(H(b,c,d)+M[j]+T[i])<<<S)
II(a,b,c,d,M[j],S,T[i])表示a=b+(a+(I(b,c,d)+M[j]+T[i])<<<S)
这里,“+”定义为mod 232的模运算。M[j]表示在第n个512位数据块的第j个32位子分组,0≤j≤15。在第i步中,T[i]是32位的随机数源,它消除了输入数据中任何规律性的特征。
五 实验步骤
本实验为一个设计性实验,要求学生自己根据实验原理,自行设计实验步骤,编程实现MD5算法。并利用该程序对一个文件或字符串进行处理,计算其Hash值。
六 程序清单
1、头文件
typedef struct {
UINT4 state[4]; /* 数组state[4]用来存储MD5的四个寄存器A,B,C,D值*/
UINT4 count[2]; /* count[0]用来记录已经处理过的位数,count[1]用来记录已经处理
过的字节数 */
unsigned char buffer[64]; /* buffer作为输入过程中的缓存 */
} MD5_CTX;
2、 主循环
/*MD5的四个基本逻辑函数F,G,H,I*/
#define F(x,y,z) (((x)&(y))|((~x)&(z)))
#define G(x,y,z) (((x)&(z))|((y)&(~z)))
#define H(x,y,z) ((x)^(y)^(z))
#define I(x,y,z) ((y)^((x)|(~z)))
/*第一轮中每一次迭代运算所输入的内容由函数FF表示*/
#define FF(a, b, c, d, x, s, ac) { \
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
/*第二轮中每一次迭代运算所输入的内容由函数GG表示*/
#define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
/*第三轮中每一次迭代运算所输入的内容由函数HH表示*/
#define HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
/*第四轮中每一次迭代运算所输入的内容由函数II表示*/
#define II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
void MD5Init(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;
}
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputLen)
{//MD5块处理函数
unsigned int i,index,partLen;
index = (unsigned int)((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 + 63 < inputLen; i += 64)
MD5Transform (context->state, &input[i]);
index = 0;
}
else
i = 0;
MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i],inputLen-i);
}
void MD5Final(unsigned char digest[16],MD5_CTX *context)
{/*完成函数,context指向上面处理过的结构体,digest[16]是用来存储结果的缓冲区
这个函数对未完成的信息先进行填充,然后处理,并把最终结果存储在digest[16]中*/
unsigned char bits[8];
unsigned int index, padLen;
Encode (bits, context->count, 8);
index = (unsigned int)((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 <stdio.h>
#include <time.h>
#include <stdlib.h>
#define RAND_MAX 0x7fff
void main(void)
{
unsigned char *inputData;
char *inp = (char *)malloc(sizeof(char)*1024);
inputData=(unsigned char*)inp;
unsigned char* hashstr;
int i,x;
time_t t; //这两行保证每次产生的随机数不同
int len;
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;
else if(x>9 && x<16)
inp[i] = 65 + x -10;
}
printf("明文字符串是: %s\n\n",inp);
if ((hashstr = (unsigned char *) malloc(17)) == NULL)
{
printf("Not enough memory to allocate buffer\n");
exit(1); // terminate program if out of memory
}
MD5String(inputData,hashstr); //调用MD5算法实现函数
printf("明文经过MD5得到的消息摘要是:%s\n",hashstr);
}
七 实验结果
由于在程序中使用了语句int i,x;和time_t t;,保证了每次产生的明文信息均不同,故经过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漏洞列表选择不
同的漏洞对目标主机进行扫描。其中,默认规则有2448条,如图4-4所示。
图4-4 漏洞扫描设置
6、 单击【下一步】按钮,出现对MS SQL 2000数据库漏洞、SA密码和版本信息
扫描对象设置的对话框,如图4-5所示。
图4-5 MS SQL 2000数据库漏洞扫描设置
7、 单击【下一步】按钮,将对计算机系统的IPC漏洞进行扫描,查看是否有空
连接、共享资源,获得用户列表并猜解用户密码,如图4-6所示。
图4-6 IPC漏洞扫描设置
8、 选择需要进行扫描的选项,如果不选择最后一项,则此软件将对所有用户的
密码进行猜解,否则只对管理员用户组的用户密码进行猜解。单击【下一步】
按钮,打开如图4-7所示的对话框。
图4-7 IIS漏洞扫描设置
9、 在这个对话框中,将设置对IIS漏洞的扫描选项,包括Unicode编码漏洞、
FrontPage扩展、尝试获取SAM文件、尝试获取PcAnyWhere密码文件。然后
单击【下一步】按钮,设置Finger扫描、对Sull OS尝试获得用户列表以及
扫描RPC服务。再单击【下一步】按钮,进行BIND版本扫描、猜解MySQL
密码和SSH版本扫描。之后单击【下一步】按钮,打开如图4-8所示的对话
框。
图4-8 插件扫描漏洞设置
10、 在这里,流光提供了对6个插件的漏洞扫描,可根据需要进行选择。单击【下
一步】按钮,打开如图4-9所示的对话框。
图4-9 猜解字典设置
11、 在这个对话框中,通过“猜解用户名字典”尝试暴力破解,用于除了IPC
之外的项目。“保存扫描报告”的存放名称和位置,默认情况下文件名以[起
始IP]-[结束IP].html为命名规则。单击【完成】按钮,通过打开的【选
择流光主机】对话框设置扫描引擎。方法如图4-10所示。
图4-10 选择流光主机
12、 选择默认的本地主机作为扫描引擎,单击【开始】按钮进行扫描,经过一段
时间后会有类似图4-11所示的扫描结果。
图4-11 探测结果显示
可以看到,扫描结束后屏幕会弹出检测结果窗口,本次漏洞扫描共检测到5条结果。同时,流光还会生成扫描报告,以网页的形式保存在预设目录之下。
该扫描结果显示主机10.103.0.194有两个端口开放并提供服务。
六 实验结果
可以看到,扫描结束后屏幕上会弹出检测结果窗口,显示检测到的结果共有 条。同时,流光还会生成扫描报告,以网页的形式保存在预设目录下。
按照以上步骤扫描主机,并查看扫描结果,了解各种系统漏洞和可能造成的危害。下载相应的系统补丁,修补系统漏洞,从而构造一个相对安全的操作系统。在安装完补丁后,重新使用流光来扫描系统漏洞,检查系统漏洞是否已经修补。
七 思考题
扫描实验室内部网络的计算机,观测内网中各个计算机打开的端口和其提供的服务, 并进行漏洞分析,提交漏洞分析和解决方案报告。
23
展开阅读全文