MD5加密算法-c源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and
4.
Rotation is separate from addition to prevent recomputation.
*/
/*MD5 initialization. Begins an MD5 operation, writing a new context.*/
#endif/*_MD5_H_*/
*/
/*md5转换用到的常量,算法本身规定的*/
#define S117
#define S1212
#define S1317
#define S1422
#define S215
#define S229
#define S2314
#define S2420
#define S314#define S3211
md5加密算法c实现
!七分注释 ! !收藏 !
经常到csdn来是查资料,每次都会有所收获。总是看别人的感觉很 不好意思,于是决定自己也写一点东西贡献出来。于是就有了这篇md5七分注释。希望对用到的朋友有所帮助。
记得当初自己刚开始学习md5的时候,从网上搜了很多关于算法的原 理和文字性的描述的东西,但是看了很久一直没有搞懂,搜c的源代 码又很少。直到后来学习rsa算法的时候,从网上下了1991年的欧 洲的什么组织写的关于rsa、des、md5算法的c源代码(各部分代码 混在一块的,比如rsa用到的随机大素数就是用机器的随机时间的md5哈希值获得的)。我才彻底把md5弄明白了。这里的代码就是我 从那里面分离出来的, 代码的效率和可重用性都是很高的。 整理了一 下希望对需要的朋友能够有帮助。
static void Decode(UINT4*,unsigned char*,unsigned int);
/*
用于bits填充的缓冲区,为什么要64个字节呢因为当欲加密的信息 的bits数被512除其余数为448时,
需要填充的bits的最大值为512=64*8。
*/
static unsigned char PADDING[64]= {
#define S3316#define S3423
#define S416
#define S4210
#define S4315
#define S4421
static void MD5Transform(UINT4[4],unsigned char[64]);
static void Encode(unsigned char*,UINT4*,unsigned int);
/*初始化md5的结构*/
void MD5Init (MD5_CTX *context)
{
/*将当前的有效信息的长度设成0,这个很简单,还没有有效信息 长度当然是0了*/
context->count[0]=context->count[1]= 0;
/*Load magic initialization constants.*/
UINT4 state[4];
/* number of bits, modulo 2八64 (Isb first) */
/*存储原始信息的bits数长度,不包括填充的bits,最长为2A64
bits,因为2A64是一个64位数的最大值*/
UINT4 count[2];
/*input buffer*/
/*存放输入的信息的缓冲区,512bits*/
unsigned char buffer[64];
}MD5_CTX;
void MD5Init(MD5_CTX*);
void MD5Update(MD5_CTX*,unsigned char*,unswenku.baidu.comgned int);
void MD5Final(unsigned char[16],MD5_CTX*);
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
/*初始化链接变量,算法要求这样,这个没法解释了*/context->state[0]=0x;
context->state[1]=0xefcdab89;
context->state[2]=0x98badcfe;
context->state[3]=0x;
/*MD5block update operation. Continues an MD5message-digest operation, processing another message block, and updating
#define G(x, y, z) (((x)&(z))|((y)&(~z))) #define H(x, y, z) ((x)八(y)八⑵)
#define I(x, y, z) ((y)八((x) | (~z)))
/* ROTATE_LEFT rotates x left n bits.
*/
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
md5的介绍的文章网上很多,关于md5的来历,用途什么的这里就不 再介绍了。这里主要介绍代码。代码明白了就什么都明白了。
*/typedef struct{
/*state (ABCD)*/
/*四个32bits数,用于存放最终计算得到的消息摘要。当消息长度〉512bits时,也用于存放每个512bits的中间结果*/
};
/*
接下来的这几个宏定义是md5算法规定的,就是对信息进行md5加密 都要做的运算。
据说有经验的高手跟踪程序时根据这几个特殊的操作就可以断定是
不是用的md5
*/
/*F, G, H and I are basic MD5 functions.
*/#define F(x, y, z) (((x)&(y))|((~x)&(z)))
相关文档
最新文档