实验四 SHA1算法原理 1分析Word文档下载推荐.docx
- 文档编号:21360419
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:15
- 大小:21.50KB
实验四 SHA1算法原理 1分析Word文档下载推荐.docx
《实验四 SHA1算法原理 1分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验四 SHA1算法原理 1分析Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
=32。
Sn(X)=(X<
<
n)OR(X>
>
32-n)
X<
n定义如下:
抛弃最左边的n位数字,将各个位依次向左移动n位,然后用0填补右边的n位(最后结果还是32位)。
X>
n是抛弃右边的n位,将各个位依次向右移动n位,然后在左边的n位填0。
因此可以叫Sn(X)位循环移位运算
3SHA1算法描述
在SHA1算法中,我们必须把原始消息(字符串,文件等)转换成位字符串。
SHA1算法只接受位作为输入。
假设我们对字符串“abc”产生消息摘要。
首先,我们将它转换成位字符串如下:
011000010110001001100011
―――――――――――――
‘a’=97‘b’=98‘c’=99
这个位字符串的长度为24。
下面我们需要5个步骤来计算MD5。
3.1补位
消息必须进行补位,以使其长度在对512取模以后的余数是448。
也就是说,(补位后的消息长度)%512=448。
即使长度已经满足对512取模后余数是448,补位也必须要进行。
补位是这样进行的:
先补一个1,然后再补0,直到长度满足对512取模后余数是448。
总而言之,补位是至少补一位,最多补512位。
还是以前面的“abc”为例显示补位的过程。
原始信息:
011000010110001001100011
补位第一步:
0110000101100010011000111
首先补一个“1”
补位第二步:
01100001011000100110001110…..0
然后补423个“0”
我们可以把最后补位完成后的数据用16进制写成下面的样子
61626380000000000000000000000000
00000000000000000000000000000000
0000000000000000
现在,数据的长度是448了,我们可以进行下一步操作。
3.2补长度
所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。
通常用一个64位的数据来表示原始消息的长度。
如果消息长度不大于2^64,那么第一个字就是0。
在进行了补长度的操作以后,整个消息就变成下面这样了(16进制格式)
00000000000000000000000000000018
如果原始的消息长度超过了512,我们需要将它补成512的倍数。
然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要。
3.3使用的常量
一系列的常量字K(0),K
(1),...,K(79),如果以16进制给出。
它们如下:
Kt=0x5A827999(0<
=t<
=19)
Kt=0x6ED9EBA1(20<
=39)
Kt=0x8F1BBCDC(40<
=59)
Kt=0xCA62C1D6(60<
=79).
3.4需要使用的函数
在SHA1中我们需要一系列的函数。
每个函数ft(0<
=79)都操作32位字B,C,D并且产生32位字作为输出。
ft(B,C,D)可以如下定义
ft(B,C,D)=(BANDC)or((NOTB)ANDD)(0<
ft(B,C,D)=BXORCXORD(20<
ft(B,C,D)=(BANDC)or(BANDD)or(CANDD)(40<
ft(B,C,D)=BXORCXORD(60<
3.5计算消息摘要
必须使用进行了补位和补长度后的消息来计算消息摘要。
计算需要两个缓冲区,每个都由5个32位的字组成,还需要一个80个32位字的缓冲区。
第一个5个字的缓冲区被标识为A,B,C,D,E。
第一个5个字的缓冲区被标识为H0,H1,H2,H3,H4
。
80个字的缓冲区被标识为W0,W1,...,W79
另外还需要一个一个字的TEMP缓冲区。
为了产生消息摘要,在第4部分中定义的16个字的数据块M1,M2,...,Mn
会依次进行处理,处理每个数据块Mi包含80个步骤。
在处理每个数据块之前,缓冲区{Hi}被初始化为下面的值(16进制)
H0=0x67452301
H1=0xEFCDAB89
H2=0x98BADCFE
H3=0x10325476
H4=0xC3D2E1F0.
现在开始处理M1,M2,...,Mn。
为了处理Mi,需要进行下面的步骤
(1).将Mi分成16个字W0,W1,...,W15,W0是最左边的字
(2).对于t=16到79令Wt=S1(Wt-3XORWt-8XORWt-14XORWt-16).
(3).令A=H0,B=H1,C=H2,D=H3,E=H4.
(4)对于t=0到79,执行下面的循环
TEMP=S5(A)+ft(B,C,D)+E+Wt+Kt;
E=D;
D=C;
C=S30(B);
B=A;
A=TEMP;
(5).令H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D,H4=H4+E.
在处理完所有的Mn,后,消息摘要是一个160位的字符串,以下面的顺序标识
H0H1H2H3H4.
对于SHA256,SHA384,SHA512。
你也可以用相似的办法来计算消息摘要。
对消息进行补位的算法完全是一样的。
sha1是一种比md5的安全性强的算法,当然sha256和sha512更好,但计算开销更大一些,理论上,凡是采取“消息摘要”方式的数字验证算法都是有“碰撞”的——也就是两个不同的东西算出的消息摘要相同,互通作弊图就是如此。
但是安全性高的算法要找到指定数据的“碰撞”很困难(困难到用暴力法寻找要花去几百年甚至几千年),而利用公式来计算“碰撞”就更困难——目前为止通用安全算法中仅有md5被破解.
附:
来自网络上的SHA-1算法,自己加了少量注释,方便以后需要的时候可以利用。
代码:
/*sha1sum.c-printSHA-1Message-DigestAlgorithm
*Copyright(C)1998,1999,2000,2001FreeSoftwareFoundation,Inc.
*Copyright(C)2004g10CodeGmbH
*
*Thisprogramisfreesoftware;
youcanredistributeitand/ormodifyit
*underthetermsoftheGNUGeneralPublicLicenseaspublishedbythe
*FreeSoftwareFoundation;
eitherversion2,or(atyouroption)any
*laterversion.
*Thisprogramisdistributedinthehopethatitwillbeuseful,
*butWITHOUTANYWARRANTY;
withouteventheimpliedwarrantyof
*MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.
Seethe
*GNUGeneralPublicLicenseformoredetails.
*YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense
*alongwiththisprogram;
ifnot,writetotheFreeSoftwareFoundation,
*Inc.,59TemplePlace-Suite330,Boston,MA02111-1307,USA.
*/
/*SHA-1codentakefromgnupg1.3.92.
Note,thatthisisasimpletooltobeusedforMSWindows.
#include<
stdio.h>
stdlib.h>
string.h>
assert.h>
errno.h>
#undefBIG_ENDIAN_HOST
typedefunsignedintu32;
/****************
*Rotatea32bitintegerbynbytes
****************/
#ifdefined(__GNUC__)&
&
defined(__i386__)
staticinlineu32rol(u32x,intn)
{
__asm__("
roll%%cl,%0"
:
"
=r"
(x)
0"
(x),"
c"
(n));
returnx;
}
#else
#definerol(x,n)(((x)<
(n))|((x)>
(32-(n))))
#endif
typedefstruct{
u32
h0,h1,h2,h3,h4;
//哈希计算后的结果是20个bit,刚好相当于5个unsignedint(4字节)类型的数据
nblocks;
unsignedcharbuf[64];
int
count;
}SHA1_CONTEXT;
voidsha1_init(SHA1_CONTEXT*hd)
//计算前进行初始化
hd->
h0=0x67452301;
h1=0xefcdab89;
h2=0x98badcfe;
h3=0x10325476;
h4=0xc3d2e1f0;
nblocks=0;
count=0;
/*
*TransformthemessageXwhichconsistsof1632-bit-words
staticvoid
transform(SHA1_CONTEXT*hd,unsignedchar*data)
u32a,b,c,d,e,tm;
u32x[16];
/*getvaluesfromthechainingvars*/
a=hd->
h0;
b=hd->
h1;
c=hd->
h2;
d=hd->
h3;
e=hd->
h4;
#ifdefBIG_ENDIAN_HOST
memcpy(x,data,64);
{inti;
unsignedchar*p2;
for(i=0,p2=(unsignedchar*)x;
i<
16;
i++,p2+=4){
p2[3]=*data++;
p2[2]=*data++;
p2[1]=*data++;
p2[0]=*data++;
}
#defineK1
0x5A827999L
#defineK2
0x6ED9EBA1L
#defineK3
0x8F1BBCDCL
#defineK4
0xCA62C1D6L
#defineF1(x,y,z)
(z^(x&
(y^z)))
#defineF2(x,y,z)
(x^y^z)
#defineF3(x,y,z)
((x&
y)|(z&
(x|y)))
#defineF4(x,y,z)
#defineM(i)(tm=
x[i&
0x0f]^x[(i-14)&
0x0f]
/
^x[(i-8)&
0x0f]^x[(i-3)&
(x[i&
0x0f]=rol(tm,1)))
#defineR(a,b,c,d,e,f,k,m)
do{e+=rol(a,5)
+f(b,c,d)
+k
+m;
b=rol(b,30);
}while(0)
R(a,b,c,d,e,F1,K1,x[0]);
R(e,a,b,c,d,F1,K1,x[1]);
R(d,e,a,b,c,F1,K1,x[2]);
R(c,d,e,a,b,F1,K1,x[3]);
R(b,c,d,e,a,F1,K1,x[4]);
R(a,b,c,d,e,F1,K1,x[5]);
R(e,a,b,c,d,F1,K1,x[6]);
R(d,e,a,b,c,F1,K1,x[7]);
R(c,d,e,a,b,F1,K1,x[8]);
R(b,c,d,e,a,F1,K1,x[9]);
R(a,b,c,d,e,F1,K1,x[10]);
R(e,a,b,c,d,F1,K1,x[11]);
R(d,e,a,b,c,F1,K1,x[12]);
R(c,d,e,a,b,F1,K1,x[13]);
R(b,c,d,e,a,F1,K1,x[14]);
R(a,b,c,d,e,F1,K1,x[15]);
R(e,a,b,c,d,F1,K1,M(16));
R(d,e,a,b,c,F1,K1,M(17));
R(c,d,e,a,b,F1,K1,M(18));
R(b,c,d,e,a,F1,K1,M(19));
R(a,b,c,d,e,F2,K2,M(20));
R(e,a,b,c,d,F2,K2,M(21));
R(d,e,a,b,c,F2,K2,M(22));
R(c,d,e,a,b,F2,K2,M(23));
R(b,c,d,e,a,F2,K2,M(24));
R(a,b,c,d,e,F2,K2,M(25));
R(e,a,b,c,d,F2,K2,M(26));
R(d,e,a,b,c,F2,K2,M(27));
R(c,d,e,a,b,F2,K2,M(28));
R(b,c,d,e,a,F2,K2,M(29));
R(a,b,c,d,e,F2,K2,M(30));
R(e,a,b,c,d,F2,K2,M(31));
R(d,e,a,b,c,F2,K2,M(32));
R(c,d,e,a,b,F2,K2,M(33));
R(b,c,d,e,a,F2,K2,M(34));
R(a,b,c,d,e,F2,K2,M(35));
R(e,a,b,c,d,F2,K2,M(36));
R(d,e,a,b,c,F2,K2,M(37));
R(c,d,e,a,b,F2,K2,M(38));
R(b,c,d,e,a,F2,K2,M(39));
R(a,b,c,d,e,F3,K3,M(40));
R(e,a,b,c,d,F3,K3,M(41));
R(d,e,a,b,c,F3,K3,M(42));
R(c,d,e,a,b,F3,K3,M(43));
R(b,c,d,e,a,F3,K3,M(44));
R(a,b,c,d,e,F3,K3,M(45));
R(e,a,b,c,d,F3,K3,M(46));
R(d,e,a,b,c,F3,K3,M(47));
R(c,d,e,a,b,F3,K3,M(48));
R(b,c,d,e,a,F3,K3,M(49));
R(a,b,c,d,e,F3,K3,M(50));
R(e,a,b,c,d,F3,K3,M(51));
R(d,e,a,b,c,F3,K3,M(52));
R(c,d,e,a,b,F3,K3,M(53));
R(b,c,d,e,a,F3,K3,M(54));
R(a,b,c,d,e,F3,K3,M(55));
R(e,a,b,c,d,F3,K3,M(56));
R(d,e,a,b,c,F3,K3,M(57));
R(c,d,e,a,b,F3,K3,M(58));
R(b,c,d,e,a,F3,K3,M(59));
R(a,b,c,d,e,F4,K4,M(60));
R(e,a,b,c,d,F4,K4,M(61));
R(d,e,a,b,c,F4,K4,M(62));
R(c,d,e,a,b,F4,K4,M(63));
R(b,c,d,e,a,F4,K4,M(64));
R(a,b,c,d,e,F4,K4,M(65));
R(e,a,b,c,d,F4,K4,M(66));
R(d,e,a,b,c,F4,K4,M(67));
R(c,d,e,a,b,F4,K4,M(68));
R(b,c,d,e,a,F4,K4,M(69));
R(a,b,c,d,e,F4,K4,M(70));
R(e,a,b,c,d,F4,K4,M(71));
R(d,e,a,b,c,F4,K4,M(72));
R(c,d,e,a,b,F4,K4,M(73));
R(b,c,d,e,a,F4,K4,M(74));
R(a,b,c,d,e,F4,K4,M(75));
R(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验四 SHA1算法原理 1分析 实验 SHA1 算法 原理 分析