信息安全系统实验报告材料Word文件下载.docx
《信息安全系统实验报告材料Word文件下载.docx》由会员分享,可在线阅读,更多相关《信息安全系统实验报告材料Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
流
程
)
1、Enigma看起来就像是一个盒子一样,
其主要的三个部件为:
键盘,
转子,
显示器
.
反射器。
2、Enigma密码机属于轮转机的一种,
它采用的也是多表替换的思想,
而且是一个长周期的多表替换密码机.
在此系列(六)中直接拿Enigma出来讲是因为Enigma比较具有代表性(当然也是最有名气的,
Enigma出自二战时期的德国军方).
其他的一些轮转机有美国的Sigaba,
日本的Red和Purple等,
都是二战时期的产物.Enigma密码机说白了就是几个机械零件组合而成的.
对于轮转机而言,
它有一个键盘和一系列的转轮,
键盘用来输入明文字符串,
每个转轮是字母的任意组合,
有26个接线端,
用来完成一种简单的替换,
同时每个转轮的输出端连接到其下一个相邻转轮的输入端.
当输入一个明文字符时,
相应的信号从第一个轮转的输入端进入,
依次经过各个相邻的转轮,当每经过一个转轮的时候,
该转轮会转动一个位置,
当该转轮装动了一个周期之后,
其下一个转轮会转动一个位置,
这样一直到达最后一个转轮,
然后反射回来,
即可得到密文。
二、实验步骤
1、使用消息的发送者利用Engima模拟器进行下列操作:
明文:
INFORMATIONSECURITY
模拟器参数设置:
UKW:
B
Walzen:
IIIV
Ringstellung:
F-06V-22N-14
Stecker:
BGCDERFVHNIUJKLMOPTY
如图所示:
生成:
在转子的起始位置:
XWB,生成INFORMATIONSECURITY的密文。
然后把转子的起始位置设为ABC,求出XWB的密文;
最后把模拟器参数设置,转子的起始位置ABC,XWB的密文,INFORMATIONSECURITY的密文发送给接收者。
2接收者收到信息后:
对XWB的密文,INFORMATIONSECURITY的密文进行解密。
结
果
分
析
及
心
得
体
会
三、实验结果分析
根据实验内容以及上述实验步骤得到结果。
通过参数设置可以将一个明文加密成一个密文,发送给接受者以后,接受者进行解密得到明文。
其中,参数的设置起到了关键性的作用。
四、心得体会
成
绩
评
定
教师签名:
年月日
基于RSA的数字签名实现
掌握RSA算法的基本原理,通过用RSA算法对实际数据进行加密和解密来深刻了解RSA的运行原理。
对数字签名有所了解,理解和掌握MD5算法,以及如何利用RSA和MD5算法来实现数字签名。
1、RSA算法
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;
再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n及e1),(n及e2)就是密钥对。
RSA加解密的算法完全相同,设A为明文,B为密文,则:
A=B^e1modn;
B=A^e2modn;
e1和e2可以互换使用,即:
A=B^e2modn;
B=A^e1modn;
2、签名算法
签名算法包括三步:
消息摘要计算,RSA加密.
消息摘要计算.消息在签名前首先通过MD5计算,生成128位的消息摘要
digest.
对摘要作RSA计算.用加密算法,采用签名者的私钥加密消息摘要,得到加密后的字符串.加密算法中使用的加密块为01类型.
3、验证签名算法
验证签名算法包括两步:
RSA解密得签名者的消息摘要,验证者对原消息计算摘要,比较两个消息摘要.验证签名的过程输入为消息,签名者的公钥,签名;
输出为验证的结果,即是否是正确的签名.
RSA解密.签名实际是加密的字符串.用3.5所述的解密算法,采用签名者的公钥对这个加密的字符串解密.解密的结果应为128位的消息摘要.在解密过程中,若出现得到的加密块的类型不是01,则解密失败.签名不正确.
消息摘要计算和比较.验证者对消息用MD5算法重新计算,得到验证者自己的消息摘要.验证者比较解密得到的消息摘要和自己的消息摘要,如果两者相同,则验证成功,可以确认消息的完整性及签名确实为签名者的;
否则,验证失败。
新建一个密钥文件:
key1.pri和key1.pub
新建一个明文文件mingwen.txt并输入xtiqjy123456进行加密过程:
将密文解密的结果存入output.txt该文件中。
确定后打开output.txt得到解密后的内容为:
xtiqjy123456即为加密的内容。
编程实现MD5算法:
(源码附后)
1、新建要加密的文件input.txt输入xtiqjy,随机产生密码:
加密后生成:
input.txt.tdes文件。
2、选择第1步生成的文件,用同样的密码解密:
选择保存文件output.txt后:
生成output.txt文件,进行解密得到output.txt内容为:
xtiqjy
心得体会:
源代码:
importjava.io.*;
publicclassRsa{
privateintp=0;
privateintq=0;
privatelongn=0;
privatelongm=0;
privatelongpublic_key=0;
//公匙
privatelongprivate_key=0;
//密匙
privatelongtext=0;
//明文
privatelongsecretword=0;
//密文
privatelongword=0;
//解密后明文
//判断是否为素数
publicbooleanprimenumber(longt)
{
longk=0;
k=(long)Math.sqrt((double)t);
booleanflag=true;
outer:
for(inti=2;
i<
=k;
i++)
{
if((t%i)==0)
{
flag=false;
breakouter;
}
}
returnflag;
}
//输入PQ
publicvoidinputPQ()throwsException{
do{
System.out.println("
请输入素数p:
"
);
BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));
Stringbr=stdin.readLine();
this.p=Integer.parseInt(br);
}while(!
primenumber(this.p));
请输入素数q:
this.q=Integer.parseInt(br);
primenumber(this.q));
this.n=this.p*this.q;
this.m=(p-1)*(q-1);
System.out.println("
这两个素数的乘积为p*q:
"
+this.n);
所得的小于N并且与N互素的整数的个数为m=(p-1)(q-1):
+this.m);
//求最大公约数
publiclonggcd(longa,longb){
longgcd;
if(b==0)gcd=a;
elsegcd=gcd(b,a%b);
gcd:
+gcd);
returngcd;
//输入公匙
publicvoidgetPublic_key()throwsException
do
请输入一个公钥的值,这个值要求小于m并且和m互质:
BufferedReaderstdin=newBufferedReader(newInputStreamReader(System.in));
Stringbr=stdin.readLine();
this.public_key=Long.parseLong(br);
}while((this.public_key>
=this.m)||(this.gcd(this.m,this.public_key)!
=1));
公钥为:
+this.public_key);
}
//计算得到密匙
publicvoidgetPrivate_key()
longvalue=1;
for(longi=1;
;
value=i*this.m+1;
value:
+value);
if((value%this.public_key==0)&
&
(value/this.public_key<
this.m))
this.private_key=value/this.public_key;
breakouter;
产生的一个私钥为:
+this.private_key);
//输入明文
publicvoidgetText()throwsException
请输入明文:
this.text=Long.parseLong(br);
}//加密、解密计算
publiclongcolum(longy,longn,longkey)
longmul;
if(key==1)mul=y%n;
elsemul=y*this.colum(y,n,key-1)%n;
returnmul;
}//加密后解密
publicvoidpascolum()throwsException
this.getText();
输入明文为:
+this.text);
//加密
this.secretword=this.colum(this.text,this.n,this.public_key);
所得的密文为:
+this.secretword);
//解密
this.word=this.colum(this.secretword,this.n,this.private_key);
解密后所得的明文为:
+this.word);
publicstaticvoidmain(String[]args)throwsException
Rsat=newRsa();
t.inputPQ();
t.getPublic_key();
t.getPrivate_key();
t.pascolum()}
基于B/S三层体系结构的用户身份验证系统
一、实验目的
基于B/S三层体系结构,实现用户身份验证。
能够熟练应用加密解密算法,基本掌握身份验证的整个流程。
本实验使用JSP+APPLET+JAVABEAN技术:
1、程序逻辑结构:
客户端通过浏览器下载APPLET和加密解密算法jar包,把密码加密成密文后发往服务器。
服务器接收到后调用JAVABEAN组件的方式解密密文,得到密码,连接数据库,查询数据库,对登陆信息中用户名和密码验证。
2、JavaBean组件
JavaBean就是一个Java类,也就意味着,JAVA的一切特性,此JavaBean没有图形显示代码,只是完成基本业务逻辑,JavaBean可以使用JAVA的封装、继承、多态,使用JavaBean封装许多重复调用的代码,使用JavaBean可以达到显示与业务的分离,显示使用JSP,业务使用JavaBean
3、Applet组件
Applet或Java小应用程序是一种在Web环境下,运行于客户端的Java程序组件。
它也是上世纪90年代中期,Java在诞生后得以一炮走红的功臣之一。
通常,每个Applet的功能都比较单一(例如仅用于显示一个舞动的Logo),因此它被称作“小应用程序”。
组
内
工
无
登陆页面:
验证:
(数据库服务器采用SQLserver2005)
登录成功:
登录失败:
<
%@pagelanguage="
java"
contentType="
text/html;
charset=UTF-8"
pageEncoding="
UTF-8"
%>
!
DOCTYPEhtmlPUBLIC"
-//W3C//DTDHTML4.01Transitional//EN"
http:
//www.w3.org/TR/html4/loose.dtd"
>
html>
head>
metahttp-equiv="
Content-Type"
content="
title>
用户登录<
/title>
scripttype="
text/javascript"
functioncheckInsert(){
varname=document.getElementById("
username"
).value;
varpwd=document.getElementById("
userpwd"
if(name==null||name=="
){
alert("
请输入您的账号!
document.getElementById("
).focus();
returnfalse;
if(pwd==null||pwd=="
请输入您的密码!
base64encode(pwd);
enterform.submit();
returntrue;
//64加密
functionbase64encode(str){
varout,i,len;
varc1,c2,c3;
len=str.length;
i=0;
out="
while(i<
len){
c1=str.charCodeAt(i++)&
0xff;
if(i==len)
out+=base64EncodeChars.charAt(c1>
2);
out+=base64EncodeChars.charAt((c1&
0x3)<
4);
out+="
=="
break;
c2=str.charCodeAt(i++);
out+=base64EncodeChars.charAt(((c1&
0x3)<
4)|((c2&
0xF0)>
4));
out+=base64EncodeChars.charAt((c2&
0xF)<
="
c3=str.charCodeAt(i++);
out+=base64EncodeChars.charAt(((c2&
2)|((c3&
0xC0)>
6));
out+=base64EncodeChars.charAt(c3&
0x3F);
returnout;
//64解密
functionbase64decode(str){
varc1,c2,c3,c4;
vari,len,out;
/*c1*/
do{
c1=base64DecodeChars[str.charCodeAt(i++)&
0xff];
}while(i<
len&
c1==-1);
if(c1==-1)
/*c2*/
c2=base64DecodeChars[str.charCodeAt(i++)&
c2==-1);
if(c2==-1)
out+=String.fromCharCode((c1<
2)|((c2&
0x30)>
/*c3*/
c3=str.charCodeAt(i++)&
if(c3==61)
c3=base64DecodeChars[c3];
c3==-1);
if(c3==-1)
out+=String.fromCharCode(((c2&
0XF)<
4)|((c3&
0x3C)>
2));
/*c4*/
c4=str.charCodeAt(i++)&
if(c4==61)
c4=base64DecodeChars[c4];
c4==-1);
if(c4==-1)
out+=String.fromCharCode(((c3&
0x03)<
6)|c4);
/script>
/head>
bodybgcolor="
#FFFFFF"
formid="
enterform"
action="
servlet/loginCheck"
<
tablewidth="
317"
height="
129"
border="
0"
cellpadding="
cellspacing="
<
tr>
<
tdwidth="
106"
align="
right"
>
用户名:
/td>
tdcolspan="
2"
valign="
middle"
inputname="
id="
type="
text"
/>
/tr>
tdalign="
密&
nbsp;
码:
password"
/table>
inputtype="
button"
value="
提交"
onclick="
checkInsert();
inputty