md5加密,这里的程序只是简单实现了md5加密的效果,适用于字符串,
md5加密的主要步骤为:
首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息(信息)长度。
md5加密的主要步骤为:
1.md5结构体定义,即md5头文件。
#ifndef MD5_FORENCRPTY_H
#define MD5_FORENCRPTY_H
/*this is only 32bit*/
typedef unsigned int md5_int;
struct MD5_struct
{
md5_int A;
md5_int B;
md5_int C;
md5_int D;
md5_int lenbuf;
char buffer[128];
};
void md5_init(struct MD5_struct *ctx,char * buffer);
void md5_process(struct MD5_struct * ctx);
char * md5_fini(struct MD5_struct *ctx,void *rebuf);
void md5_buffer_full(struct MD5_struct * ctx);
void md5_print(struct MD5_struct * ctx);
#endif
2.信息初始化。
md5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息(信息)长度。
需要用于用于初始化md5结构体的四个32位变量为:
ctx->A=0x67452301;
ctx->B=0xefcdab89;
ctx->C=0x98badcfe;
ctx->D=0x10325476;
3.定义循环的线性函数。
#define F(x,y,z) (((x)&(y))|((~x)&(z)))
#define G(x,y,z) (((x)&(z))|((y)&(~z)))
#define H(x,y,z) ((x)^(y)^(z))
#define I(x,y,z) ((y)^((x)|(~z)))
//数据移位处理
#define ROT(x,s) (x=(x<<s)|(x>>(32-s)))
#define FF(a,b,c,d,j,s,T) {a=a+(F(b,c,d)+M[j]+T);ROT(a,s);a=a+b;}
#define GG(a,b,c,d,j,s,T) {a=a+(G(b,c,d)+M[j]+T);ROT(a,s);a=a+b;}
#define HH(a,b,c,d,j,s,T) {a=a+(H(b,c,d)+M[j]+T);ROT(a,s);a=a+b;}
#define II(a,b,c,d,j,s,T) {a=a+(I(b