文档详情

WINRAR加密中SHA1算法原理及其密钥产生过程

ss****gk
实名认证
店铺
DOC
104KB
约4页
文档ID:234206656
WINRAR加密中SHA1算法原理及其密钥产生过程_第1页
1/4

WINRAR加密中SHA1算法原理及其密钥产生过程1 SHA1算法简介安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature St&ard DSS)里而定义的数字签名算法(Digital Signature Algorithm DSA)对于长度小于 2人64位的消息,SHA1会产生一个160位的消息摘要当接收到消息的时候,这个消息摘要 可以用来验证数据的完整性在传输的过程中,数据很可能会发生变化,那么这时候就会产 生不同的消息摘要SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消 息摘要2术语和概念2.1 位(Bit),字节(Byte)和字(Word)SHA1始终把消息当成一个位(bit)字符串来处理本文中,一个“字” (Word)是昱 位,而一个“字节”(Byte)是8位比如,字符串“abc”可以被转换成一个位字符串:01100001 0110001001100011它也可以被表示成16进制字符串:0x616263.2.2运算符和符号下面的逻辑运算符都被运用于“字” (Word)X&Y = X, Y逻辑与X| Y = X, Y逻辑或XAY=X, Y逻辑异或〜X = X逻辑取反X+Y定义如下:字X和Y代表两个整数x和y,其中0v=x<2A32且0<=丫<2人32.令整数z = (x + y) mod 2A32.这时候0<=z<2八32.将z转换成字乙 那么就是Z = X + Y.循环左移位操作符Sn(X)o X是一个字,n是一个整数,0<=n<=32。

Sn(X)= (X«n)|(X»32-n)X«n定义如下:抛弃最左边的n位数字,将各个位依次向左移动n位,然后用0填补 右边的n位(最后结果还是32位)X»n是抛弃右边的n位,将各个位依次向右移动n位, 然后在左边的n位填0因此可以叫Sn(X)位循环移位运算3 SHA1算法描述在SHA1算法中,我们必须把原始消息(字符串,文件等)转换成位字符串SHA1算 法只接受位作为输入假设我们对字符串“abc”产生消息摘要首先,我们将它转换成位字 符串如下:01100001 0110001001100011'a'=97 'b'=98 'c'=99这个位字符串的长度为24下面我们需要5个步骤来计算MD5o3」补位消息必须进行补位,以使其长度在对512取模以后的余数是448也就是说,(补位后 的消息长度)%512 = 448即使长度已经满足对512取模后余数是448,补位也必须要进行补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数是448 总而言之,补位是至少补一位,最多补512位还是以前面的“abc"为例显示补位的过程原始信息:01100001 0110001001100011补位第一步:01100001 0110001001100011 1首先补一个“1”补位第二步:01100001 0110001001100011 10.....0然后补423个“0”我们可以把最后补位完成后的数据用16进制写成下面的样子61626380 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000现在,数据的长度是448 了,我们可以进行下一步操作。

3.2补长度所谓的补长度是将原始数据的长度补到己经进行了补位操作的消息后面通常用一个 64位的数据來表示原始消息的长度如果消息长度不大于2人64,那么第一个字就是0在 进行了补长度的操作以后,整个消息就变成下面这样了(16进制格式)61626380 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 00000018如果原始的消息反度超过了 512,我们需要将它补成512的倍数然后我们把整个消息 分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要3.3使用的常量一系列的常量字K(0),K(l),...,K(79),如果以16进制给出它们如下:Kt = 0x5A827999 (0 <= t<= 19)Kt = 0x6ED9EBAl (20 <= t <= 39)Kt = 0x8F 1BBCDC (40 <=t <= 59)Kt = 0xCA62C 1D6 (60 <=t <= 79).3.4需要使用的函数在SHA1中我们需要一系列的函数。

每个函数ft (0 v= t <= 79)都操作32位字B, C, D 并且产生32位字作为输出ft(B,C,D)可以如下定义ft(B,C,D) = (B & C) or ((〜B) & D)(0<=t<= 19)ft(B,C,D) = B A C A D (20 <= t <= 39)ft(B,C,D) = (B & C) or (B & D) or (C & D) (40 <= t <= 59)ft(B,C,D) = B A C A D (60 <= t <= 79).3.5计算消息摘要必须使用进行了补位和补长度后的消息来计算消息摘要计算需要两个缓冲区,每个都 由5个32位的字组成,还需要一个80个32位字的缓冲区第一个5个字的缓冲区被标识 为A, B, C, D, E第一个5个字的缓冲区被标识为HO,H1,H2,H3,H4o 80个字的缓冲区被标识为WO, Wl,..., W79另外还需要一个一个字的TEMP缓冲区为了产生消息摘要,在第4部分中定义的16个字的数据块Ml, M2,..., Mn会依次进行处理,处理每个数据块Mi包含80个步骤在处理每个数据块之前,缓冲区被初始化为下面的值(16进制)H0 = 0x67452301Hl =0xEFCDAB89H2 = 0x98BADCFEH3 = 0x10325476H4 = 0xC3D2ElF0.现在开始处理为了处理Mi,需要进行下面的步骤(1) .将 Mi分成16个字 W0,Wl,...,W15,W0是最左边的字(2) .对于 t= 16 到 79 令 Wt = Sl(Wt-3 A Wt-8 A Wt-14 A Wt-16).(3) .令 A = HO, B = Hl, 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, Hl =H1+B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.在处理完所有的Mn,后,消息摘要是一个160位的字符串,以下面的顺序标识 H0H1 H2 H3 H4.对于SHA256,SHA384,SHA512°你也可以用相似的办法来计算消息摘要。

对消息进行 补位的算法完全是一样的4.布尔函数的性质4.1 ft(B,C,D) = (B & C) or ((〜B) & D) ( 0<=t <= 19)ft(B,C,D)=ft(〜B,C,D)<=>C=Dft(B,C,D)=fl(B,〜C,D)=D<=>B=0〜D)=C<=>B=14.2 ft(B,C,D) = B A C A D (20 <= t <= 39)ft(B,C,D)=T、t(〜B,C,D)=Tt(B,Y,D)=5(B,C,〜D) fKB,C,D)=ft(〜B,〜C,D) =ft(〜B,C,〜D 尸仕(B,〜C,〜D)4.3 ft(B,C,D) = (B & C) or (B & D) or (C & D) (40 <= t <= 59)ft(B,C,D)=ft(~B,C,D) <=> C=I)ft(B,C,D)=h(B,〜C,D) <=> B=Dft(B,C,D)=ft(B,C,~D) <=> B=C4.4 ft(B,C,D) = B A C A D (60 <= t <= 79).ft(B,C,D)jf((〜B,C,D)6ft(B,C,D)sft(B,C,〜D)ft(B,C,D)Mi(〜B,〜C,D)=ft(〜B,C,〜D)=ft(B,Y,〜D)6 WINRAR 的 AESInit 及 AESKey 产生过程typcdcf struct {uint32 state[5];//5 个寄存器uint32 count[2];//数据的位数,64 位整数,count[0]为低 32 位,count[ 1 ]为高 32 位, unsigned char buff er [64];} hash context;PassWord[]= {pw 1 ,pw2,pw3...,pwn};//pwi 为密码字符SALT[]={sl,s2,s3,...,s8};//固定8字节长,在文件名加密的RAR文件0x14位置RawPsw[]={pw 1,0,pw2,0,pw3,0,... ,pwn,0,s 1 ,s2,s3,... ,s8};初始化hash context c;〃标准SHA1算法初值for(i=0;i<0x40000;i++){uchari0,il,i2;//i0,il,i2为i的从低到高的三个字节值RawPswhash[] = RawPsw[]+{iO,il,i2}Length_ RawPswhash = RawPswhash 的长度;对RawPswhash前面每段64字节进行SHA1标准处理,剩余不足64字节的数据暂不处 理;if(i0=0 且 i2==0){hash context tempc=c;将tempc中剩余的未处理数据按规则补位至448位,再将数据总长度(字节数,8字节 长)加到数据尾部,完成SHA1的处理AESInit[⑵=tempc.state[4]&0xfT;将c中剩余的未处理数据按规则补位至448位,再将数据总长度(字节数,8字节长)加到 数据尾部,完成SHA1的处理for(i=0;i<4;i-H-)AESKey[i]=c.state[i];。

下载提示
相似文档
正为您匹配相似的精品文档