MD5算法实现解读

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(a)=ROTATE_LEFT((a),(s));/
(a)+=(b);/
}
#defineGG(a,b,c,d,x,s,ac){/
(a)+=G((b),(c),(d))+(x)+(UINT4)(ac);/
(a)=ROTATE_LEFT((a),(s));/
(a)+=(b);/
}
#defineHH(a,b,c,d,x,s,ac){/
#defineS2314
#defineS2420
#defineS314
#defineS3211
#defineS3316
#defineS3423
#defineS416
#defineS4210
#defineS4315
#defineS4421
staticvoidMD5Transform(UINT4[4],unsignedchar[64]);
/*MD5context.*/
typedefstruct{
/*state(ABCD)*/
/*四个32bits数,用于存放最终计算得到的消息摘要。当消息长度〉512bits时,也用于存放每个512bits的中间结果*/
UINT4state[4];
/*numberofbits,modulo2^64(lsbfirst)*/
#define_MD5_H_
#defineR_memset(x,y,z)memset(x,y,z)
#defineR_memcpy(x,y,z)memcpy(x,y,z)
#defineR_memcmp(x,y,z)memcmp(x,y,z)
typedefunsignedlongUINT4;
typedefunsignedchar*POINTER;
需要填充的bits的最大值为512=64*8。
*/
staticunsignedcharPADDING[64]={
0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
/*md5.cpp*/
#include"stdafx.h"
/*ConstantsforMD5Transformroutine.*/
/*md5转换用到的常量,算法本身规定的*/
#defineS117
#defineS1212
#defineS1317
#defineS1422
#defineS215
#defineS229
};
/*
接下来的这几个宏定义是md5算法规定的,就是对信息进行md5加密都要做的运算。
据说有经验的高手跟踪程序时根据这几个特殊的操作就可以断定是不是用的md5
*/
/*F,G,HandIarebasicMD5functions.
*/
#defineF(x,y,z)(((x)&(y))|((~x)&(z)))
#defineG(x,y,z)(((x)&(z))|((y)&(~z)))
#defineH(x,y,z)((x)^(y)^(z))
#defineI(x,y,z)((y)^((x)|(~z)))
/*ROTATE_LEFTrotatesxleftnbits.
*/
#defineROTATE_LEFT(x,n)(((x)<<(n))|((x)>>(32-(n))))
/*FF,GG,HH,andIItransformationsforrounds1,2,3,and4.
Rotationisseparatefromadditiontopreventrecomputation.
*/
#defineFF(a,b,c,d,x,s,ac){/
(a)+=F((b),(c),(d))+(x)+(UINT4)(ac);/
context->count[0]=context->count[1]=0;
md5
md5的介绍的文章网上很多,关于md5的来历,用途什么的这里就不再介绍了。这里主要介绍代码。代码明白了就什么都明白了。
////////////////////////////////////////////////////////////////////
/*md5.h*/
#ifndef_MD5_H_
voidMD5Update(MD5_CTX*,unsignedchar*,unsignedint);
voidMD5Final(unsignedchar[16],MD5_CTX*);
#endif/*_MD5_H_*/
///////////////////////////////////////////////////////////////////////////
staticvoidEncode(unsignedchar*,UINT4*,unsignedint);
staticvoidDecode(UINT4*,unsignedchar*,unsignedint);
/*
用于bits填充的缓冲区,为什么要64个字节呢?因为当欲加密的信息的bits数被512除其余数为448时,
(a)+=H((b),(c),(d))+(x)+(UINT4)(ac);/
(a)=ROTATE_LEFT((a),(s));/
(a)+=(b);/
}
#defineII(a,b,c,d,x,s,ac){/
(a)+=I((b),(c),(d))+(x)+(UINT4)(ac);/
(a)=ROTATE_LEFT((a),(s));/
/*存储原始信息的bits数长度,不包括填充的bits,最长为2^64bits,因为2^64是一个64位数的最大值*/
UINT4count[2];
/*inputbuffer*/
/*存放输入的信息的缓冲区,512bits*/
unsignedcharbuffer[64];
}MD5_CTX;
voidMD5Init(MD5_ቤተ መጻሕፍቲ ባይዱTX*);
(a)+=(b);/
}
/*MD5initialization.BeginsanMD5operation,writinganewcontext.*/
/*初始化md5的结构*/
voidMD5Init(MD5_CTX*context)
{
/*将当前的有效信息的长度设成0,这个很简单,还没有有效信息,长度当然是0了*/
相关文档
最新文档