中国矿业大学密码学课程设计报告剖析Word下载.docx
《中国矿业大学密码学课程设计报告剖析Word下载.docx》由会员分享,可在线阅读,更多相关《中国矿业大学密码学课程设计报告剖析Word下载.docx(39页珍藏版)》请在冰豆网上搜索。
此次密码学课程设计,主要设计的是维吉尼亚密码算法、实现HASH算法SHA1、AES算法的实现以及实现椭圆曲线密码算法。
这些经典的密码算法是我们学习密码学课程设计所必须掌握的,也是学习信息安全的基础。
通过这次的密码学课程设计,对密码技术有了更深入的了解和掌握。
关键词:
信息安全;
密码学;
密码技术。
1古典密码Vignere
1.1古典密码Vignere概述
1858年法国密码学家维吉尼亚提出一种以移位替换为基础的周期替换密码。
这种密码是多表替换密码的一种。
是一系列(两个以上)替换表依次对明文消息的字母进行替换的加密方法。
1.2算法原理与设计思路
1.首先使用维吉尼亚方阵,它的基本方阵是26列26行。
方阵的第一行是a到z按正常顺序排列的字母表,第二行是第一行左移循环一位得到得,其他各行依次类推。
2.加密时,按照密钥字的指示,决定采用哪一个单表。
例如密钥字是bupt,加密时,明文的第一个字母用与附加列上字母b相对应的密码表进行加密,明文的第二个字母用与附加列的字母u相对应的密码表进行加密,依次类推。
3.令英文字母a,b,…,z对应于从0到25的整数。
设明文是n个字母组成的字符串,即m=m1m2m3m4…mn
密钥字周期性地延伸就给出了明文加密所需的工作密钥
K=k1k2…kn,E(m)=C=c1c2…cn
加密:
Ci=mi+kimod26
解密:
mi=ci-kimod26,i=1,2,3,…,n
加密算法的关键是给出初始密钥,例如第一个密钥字母是e,对第一个明文字母p进行加密时,选用左边附加列上的字母e对应的那一行作为代替密码表,查处与p相对应的密文字母是T,依次类推即可得出明文。
上述代码中的生成密钥部分为核心代码,只有密钥更长,才能保证密码算法的可靠性。
解密算法和加密算法只需要减去密钥继续模26即可得到。
1.3密码安全性分析
首先,破译的第一步就是寻找密文中出现超过一次的字母。
有两种情况可能导致这样的重复发生。
最有可能的是明文中同样的字母序列使用密钥中同样的字母加了密;
另外还有一种较小的可能性是明文中两个不同的字母序列通过密钥中不同部分加了密,碰巧都变成了密文中完全一样的序列。
假如我们限制在长序列的范围内,那么第二种可能性可以很大程序地被排除,这种情况下,我们多数考虑到4个字母或4个以上的重复序列。
其次,破译的第二步是确定密钥的长度,又看看这一段先:
密钥FORESTFORESTFORESTFORESTFOR明文bettertodowellthantosaywell密文GSKXWKYCUSOXQZKLSGYCJEQPJZC第一个YC出现后到第二个YC的结尾一共有12个字母(USOXQZKLSGYC)那么密钥的长度应是12的约数---1,2,3,4,6,12之中的一个(其中,1可排除)。
第三,破译的时候,可以从一下几个方面进行考虑。
1.A-E段,U-Z段以及O-T段的特征比较显著,可先从这些方面着手;
2.如果一些字符串出现的频率较多,不妨猜猜,特别要注意THE,-ING等的出现;
3.要留意那些图表中没有出现的字母,很多时候也会是突破点,如X与Z的空缺;
4.图表最好还是做一下,毕竟比较直观,好看。
因此,利用单纯的数学统计方法就可以攻破维吉尼亚密码,所以在使用这种密码的过程中,我们尽量增加密钥的长度,只有密钥长度的足够长时,密码的使用才会越安全。
1.4实验代码
#include<
iostream>
string>
usingnamespacestd;
constintN=26;
charv[N][N]={{'
A'
'
B'
C'
D'
E'
F'
G'
H'
I'
J'
K'
L'
M'
N'
O'
P'
Q'
R'
S'
T'
U'
V'
W'
X'
Y'
Z'
}};
intnumber(charx)//把行号字母对应到数字
{
chary='
a'
;
for(inti=0;
i<
N;
i++)
{
if(x==(y+i))returni;
}
}
voidencryption(stringm,stringk)//加密
cout<
<
"
明文:
cin>
>
m;
密钥:
k;
intmlen,klen;
mlen=m.length();
klen=k.length();
char*p,*q,*t;
//明文,初始密钥,密钥串。
把string换成char
p=newchar[m.length()+1];
strcpy(p,m.c_str());
q=newchar[k.length()+1];
strcpy(q,k.c_str());
t=newchar[m.length()+1];
intj=0;
mlen;
t[i]=q[j];
j++;
j=j%klen;
}//生成密钥
密文:
for(i=0;
v[number(t[i])][number(p[i])];
endl;
voiddisencryption(stringc,stringk)//解密
c;
intclen,klen;
clen=c.length();
//密文,初始密钥,密钥串。
p=newchar[c.length()+1];
strcpy(p,c.c_str());
t=newchar[c.length()+1];
clen;
for(intj=0;
j<
j++)
if(v[number(t[i])][j]==p[i]){cout<
char(j+97);
break;
intmain()
for(inti=1;
j++)
v[i][j]=v[i-1][(j+1)%N];
}//方阵初始化
欢迎使用维吉尼亚加密!
endl<
请选择要进行的操作"
intflag;
do{
1.加密2.解密3.结束:
flag;
stringm,k;
if(flag==1)encryption(m,k);
elseif(flag==2)disencryption(m,k);
elseif(flag!
=1&
&
flag!
=2&
=3)cout<
输入错误,请重新输入!
}while(flag!
=3);
return0;
1.5实验结果展示
2HASH算法SHA1的实现
2.1算法原理与设计思想
2.1.1安全哈希算法概述
安全哈希算法(SecureHashAlgorithm)主要适用于数字签名标准(DigitalSignatureStandardDSS)里面定义的数字签名算法(DigitalSignatureAlgorithmDSA)。
对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。
当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。
在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。
SHA1有如下特性:
不可以从消息摘要中复原信息;
两个不同的消息不会产生同样的消息摘要。
2.1.2SHA1的分组过程
对于任意长度的明文,SHA1的明文分组过程与MD5相类似,首先需要对明文添加位数,使明文总长度为448(mod512)位。
在明文后添加位的方法是第一个添加位是l,其余都是0。
然后将真正明文的长度(没有添加位以前的明文长度)以64位表示,附加于前面已添加过位的明文后,此时的明文长度正好是512位的倍数。
与MD5不同的是SHA1的原始报文长度不能超过2的64次方,另外SHA1的明文长度从低位开始填充。
经过添加位数处理的明文,其长度正好为512位的整数倍,然后按512位的长度进行分组(block),可以划分成L份明文分组,我们用Y0,Y1,……YL-1表示这些明文分组。
对于每一个明文分组,都要重复反复的处理,这些与MD5是相同的。
对于512位的明文分组,SHA1将其再分成16份子明文分组(sub-block),每份子明文分组为32位,我们使用M[k](k=0,1,……15)来表示这16份子明文分组。
之后还要将这16份子明文分组扩充到80份子明文分组,我们记为W[k](k=0,1,……79),扩充的方法如下。
Wt=Mt,当0≤t≤15
Wt=(Wt-3⊕Wt-8⊕Wt-14⊕Wt-16)<
1,当16≤t≤79
SHA1有4轮运算,每一轮包括20个步骤(一共80步),最后产生160位摘要,这160位摘要存放在5个32位的链接变量中,分别标记为A、B、C、D、E。
这5个链接变量的初始值以16进制位表示如下。
A=0x67452301
B=0xEFCDAB89
C=0x98BADCFE
D=0x10325476
E=0xC3D2E1F0
2.1.3SHA1的4轮运算
SHA1有4轮运算,每一轮包括20个步骤,一共80步,当第1轮运算中的第1步骤开始处理时,A、B、C、D、E五个链接变量中的值先赋值到另外5个记录单元A′,B′,C′,D′,E′中。
这5个值将保留,用于在第4轮的最后一个步骤完成之后与链接变量A,B,C,D,E进行求和操作。
SHA1的4轮运算,共80个步骤使用同一个操作程序,如下:
A,B,C,D,E←[(A<
5)+(B,C,D)+E+Wt+Kt],A,(B<
30),C,D
其中(B,C,D)为逻辑函数,Wt为子明文分组W