资源描述:
《单向散列函数算法Hash算法.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、单向散列函数算法(Hash算法):一种将任意长度的消息压缩到某一固定长度(消息摘要)的函数(过程不可逆),常见的单向散列算法有MD5,SHA.RIPE-MD,HAVAL,N-Hash由于Hash函数的为不可逆算法,所以软件智能使用Hash函数作为一个加密的中间步骤MD5算法:即为消息摘要算法(MessageDigestAlgorithm),对输入的任意长度的消息进行预算,产生一个128位的消息摘要简易过程:1、数据填充..即填出消息使得其长度与448(mod512)同余,也就是说长度比512要小64位(为什么数据长度本身已经满足却仍然需要填充?直接填充一个整数
2、倍)填充方法是附一个1在后面,然后用0来填充..2、添加长度..在上述结果之后附加64位的消息长度,使得最终消息的长度正好是512的倍数..3、初始化变量..用到4个变量来计算消息长度(即4轮运算),设4个变量分别为A,B,C,D(全部为32位寄存器)A=1234567H,B=89abcdefH,C=fedcba98H,D=7654321H4、数据处理..首先进行分组,以512位为一个单位,以单位来处理消息..首先定义4个辅助函数,以3个32为双字作为输入,输出一个32为双字F(X,Y,Z)=(X&Y)
3、((~X)&Z)G(X,Y,Z)=(X&Z)
4、(Y&(~
5、Z))H(X,Y,Z)=X^Y^ZI(X,Y,Z)=Y^(X
6、(~Z))其中,^是异或操作这4轮变换是对进入主循环的512为消息分组的16个32位字分别进行如下操作:(重点)将A,B,C,D的副本a,b,c,d中的3个经F,G,H,I运算后的结果与第四个相加,再加上32位字和一个32位字的加法常数(所用的加法常数由这样一张表T[i]定义,期中i为1至64之中的值,T[i]等于4294967296乘以abs(sin(i))所得结果的整数部分)(什么是加法常数),并将所得之值循环左移若干位(若干位是随机的??),最后将所得结果加上a,b,c,d之一(这个之一也是随
7、机的?)(一轮运算中这个之一是有规律的递增的..如下运算式),并回送至A,B,C,D,由此完成一次循环。(这个循环式对4个变量值进行计算还是对数据进行变换??)Fori=0toN/16doForj=0to15doSetX[i]toM[i*16+j]EndAA=ABB=BCC=CDD=D//第一轮,令[ABCDKSI]表示下面的操作://A=B+((A+F(B,C,D)+X[K]+T[I])<<
8、A7228][ABCD879]….有一共16次//第二轮,令[ABCDKSI]表示如下操作//A=B+((A+G(B,C,D)+X[K]+T[I])<<
9、336]//第四轮,令[ABCDKSI]表示如下运算//A=B+((A+I(B,C,D)+X[K]+T[I])<<
10、易过程:1、消息分组和填充方式与MD5相同2、使用了f0,f1,…,f79这样一个逻辑函数序列,每一个ft(0<=t<=79)对3个32位的双字B,C,D进行操作,产生一个32位双字的输出。Ft(B,C,D)定义如下:Ft(B,C,D)=(B&C)
11、((~B)&D)0<=t=19Ft(B,C,D)=B^C^D20<=t<=39Ft(B,C,D)=(B&C)
12、(B&D)
13、(C&D)40<=t<=59Ft(B,C,D)=B^C^D60<=t<=79在C语言中常用宏定义进行初始化同样SHA-1也使用了一系列的常数K(0),K(1),….,K(79)).用十六进制表示
14、就是Kt=5A8279990<=t<=