當前位置:編程學習大全網 - 源碼下載 - 找壹個計算文件MD5程序(C或C++都可以)。

找壹個計算文件MD5程序(C或C++都可以)。

# include & ltstdio.h & gt

# 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;

}

  • 上一篇:集中式日誌分析平臺 - ELK Stack - Filebeat 的註意事項
  • 下一篇:卡梅隆為什麽叫卡神
  • copyright 2024編程學習大全網