# include & ltstdlib.h & gt
# include & ltmemory.h & gt
# include & ltmath.h & gt
#include "windows.h"typedef無符號字符字節;
typedef無符號整數單元;
typedef UINT MD5 _ SUB _ ARRAY[16];
typedef UINT MD5 _ trans ORM _ FUNC(UINT,UINT,UINT);
typedef結構
{
UINT a;
UINT b;
UINT c;
UINT d;
MD5_SUB_ARRAY子陣列;
} MD5 _ TRANSFORM _參數;const double MAX _ INT =(double)0x ffffffff+1.0;const UINT MD5 _ TRANSFORM _ MATRIX[4][16][3]=
{{
{ 0, 7, 1}, { 1,12, 2}, { 2,17, 3}, { 3,22, 4},
{ 4, 7, 5}, { 5,12, 6}, { 6,17, 7}, { 7,22, 8},
{ 8, 7, 9}, { 9,12,10}, {10,17,11}, {11,22,12},
{12, 7,13}, {13,12,14}, {14,17,15}, {15,22,16},
},{
{ 1, 5,17}, { 6, 9,18}, {11,14,19}, { 0,20,20},
{ 5, 5,21}, {10, 9,22}, {15,14,23}, { 4,20,24},
{ 9, 5,25}, {14, 9,26}, { 3,14,27}, { 8,20,28},
{13, 5,29}, { 2, 9,30}, { 7,14,31}, {12,20,32},
},{
{5, 4, 33}, { 8,11,34}, {11,16,35},{14, 23,36},
{1,4,37},{ 411,38},{ 716,39},{10,23,40},法耶
{13,4, 41}, { 0,11,42}, { 3,16,43},{ 6, 23,44},
{9, 4, 45}, {12,11,46}, {15,16,47},{ 2, 23,48},
},{
{ 0,6,49}, { 7,10,50}, {14,15,51},{ 5, 21,52},
{12,6,53}, { 3,10,54}, {10,15,55},{ 1, 21,56},
{ 8,6,57}, {15,10,58}, { 6,15,59},{13, 21,60},
{ 4,6,61}, {11,10,62}, { 2,15,63},{ 9, 21,64},
},
};靜態UINT MD5 _ TRANSFORM _ ARRAY[65];void MD5_Init()
{
int x;
for(x = 1;x & lt= 64;x++)
{
MD5 _ TRANSFORM _ ARRAY[fayer]=(UINT)(MAX _ INT * fabs(sin(x)));
}
}UINT F(UINT x,UINT y,UINT z)
{
return((x & amp;y)|((~ x)& amp;z));
}UINT G(UINT x,UINT y,UINT z)
{
return((x & amp;z)|(y & amp;(~ z)));
}UINT H(UINT x,UINT y,UINT z)
{
返回(x ^ y ^ z);
}UINT I(UINT x,UINT y,UINT z)
{
return(y ^(x |(~ z)));
} BYTE* MD5_prepare_data(常量BYTE* data,int len,int* new_len)
{
int rest,fill,size
BYTE * new _ data
UINT位_長度;// (1)字節完成
rest = len % 56
if(rest & lt;= 56)填充= 56 -剩余;
else fill =(64-rest)+56;new _ data =(BYTE *)malloc(len+fill+8);
if (NULL == new_data)返回NULL;if(len & gt;0) memcpy(new_data,datafayer,len);
if(fill & gt;0) memset(new_data + len,0x80,1);
if(fill & gt;1)memset(new _ data+len+1,0,fill-1);size = fill+len;// (2)附加數據的比特長度
bit _ len = len * 8;
//位長的低32位(用64位二進制數表示)
memset(new_data + size + 0。0x000000FF),1);
memset(new_data + size + 1。0x0000FF00)>& gt8, 1);
//不考慮位長超出32位無符號數的範圍,所以高32位始終為0。
memset(new_data + size + 4,0,4);* new _ len = size+8;返回new _ data
} void MD5 _ TRANSFORM(MD5 _ TRANSFORM _ PARAM * PARAM,int ring,MD5_TRANSORM_FUNC func)
{
UINT a、b、c、d、s、k、I;
UINT ABCD[4];
UINT *X,* T;
int索引;ABCD[0]= param-& gt;a;
abcd[1] = param->b;
ABCD[2]= param-& gt;c;
ABCD[3]= param-& gt;d;
x = param-& gt;子數組;
T = MD5 _ TRANSFORM _ ARRAYfor(索引= 0;index & lt16;index++)
{
a = ABCD[(3 * index+0)% 4];
b = ABCD[(3 * index+1)% 4];
c = ABCD[(3 * index+2)% 4];
d = ABCD[(3 * index+3)% 4];k = MD5 _ TRANSFORM _ MATRIX[ring][index][0];
s = MD5 _ TRANSFORM _ MATRIX[ring][index][1];
I = MD5 _ TRANSFORM _ MATRIX[ring][index][2];a = a + func(b,c,d)+X[k]+T[I];
a =(a & lt;& lts)|(a & gt;& gt(32-s));//循環左移
a = a+b;ABCD[(3 * index+0)% 4]= a;
} param-& gt;a = ABCD[0];
param-& gt;b = ABCD[1];
param-& gt;c = ABCD[2];
param-& gt;d = ABCD[3];
}int MD5(常量字節*數據,int len)
{int x,y,new _ len
MD5 _ TRANSFORM _ PARAM param
UINT AA,BB,CC,DD;
BYTE * bufMD5 _ Init();buf = MD5_prepare_data(data,len & amp;new _ len);
if (buf == NULL)返回-1;AA = 0x 67452301;
BB = 0xefcdab89
CC = 0x 98 bad cfe;
DD = 0x 10325476;for(x = 0;x & ltnew _ len/64;x++)
{
param.a = AA
param.b = BB
param.c = CC
param.d = DDfor(y = 0;y & lt16;y++)
{
param . sub _ array[y]= buf[64 * x+4 * y+0];
param . sub _ array[y]+= buf[64 * x+4 * y+1]& lt;& lt8;
param . sub _ array[y]+= buf[64 * x+4 * y+2]& lt;& lt16;
param . sub _ array[y]+= buf[64 * x+4 * y+3]& lt;& lt24;
}
MD5 _ transform(amp;param,0,F);
MD5 _ transform(amp;param,1,G);
MD5 _ transform(amp;param,2,H);
MD5 _ transform(amp;param,3,I);AA+= param . a;
b b+ = param . b;
CC+= param . c;
DD+= param . d;
}printf("MD5(\"%s\")= ",data);printf("%02X%02X%02X%02X ",
(AA & amp0x000000FF),
(AA & amp0x0000FF00)>& gt8,
(AA & amp0x00FF0000)>& gt16,
(AA & amp0xFF000000)>& gt24);printf("%02X%02X%02X%02X ",
(BB & amp0x000000FF),
(BB & amp0x0000FF00)>& gt8,
(BB & amp0x00FF0000)>& gt16,
(BB & amp0xFF000000)>& gt24);printf("%02X%02X%02X%02X ",
(CC & amp0x000000FF),
(CC & amp0x0000FF00)>& gt8,
(CC & amp0x00FF0000)>& gt16,
(CC & amp0xFF000000)>& gt24);printf("%02X%02X%02X%02X ",
(DD & amp0x000000FF),
(DD & amp0x0000FF00)>& gt8,
(DD & amp0x00FF0000)>& gt16,
(DD & amp0xFF000000)>& gt24);printf(" \ n ");返回0;
}
int main()
{
MD5((unsigned char *)" ",0);//這裏需要將待處理字符串的強制類型轉換為無符號char *,與MD5()參數類型壹致。
MD5((無符號字符*)“a”,1);
MD5((無符號字符*)“ABC”,3);
MD5((unsigned char *)“消息摘要”,14);
MD5((unsigned char *)" abcdefghijklmnopqrstuvwxyz ",26);返回0;
}