📄 md5.h
字号:
// md5.h
#include "stdio.h"
#include "math.h"
#include "iostream.h"
unsigned long h[4] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476};
unsigned long k_md5[64] =
{
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8,
0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391};
int s[64] = {
7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21};
unsigned char buffer[1088];
unsigned long rol( unsigned long a, int n)
{
return ((a<<n)|(a>>(32-n)));
}
long FileSize( FILE *fp)
{
fseek( fp, 0, SEEK_END);
long temp = ftell( fp);
rewind( fp);
return temp;
}
void Fill( int count, unsigned long bit_size)
{
if (count%64 < 56)
{
buffer[count ++] = 128;
while( count%64 < 56)
{
buffer[count] = 0;
count ++;
}
}
else
{
if(56 <= count%64 )
{
buffer[count ++] = 128;
for( int i = 120 - count%64; i > 0; i --)
{
buffer[count] = 0;
count ++;
}
}
}
for( int i = count; i < count + 8; i ++)
{
buffer[i] = bit_size & 0xff;
bit_size >>= 8;
}
}
void GetM(unsigned long M[], int begin)
{
for( int i = 0; i < 16; i ++)
{
for( int j = 3; j >= 0; j --) //
{
M[i] <<= 8;
M[i] |= buffer[begin + i*4 + j];
}
}
}
unsigned long Md5( FILE *fp, unsigned char *md5)
{
unsigned int fread_time = 0, round = 0, count = 0, begin = 0;
unsigned long f_size;
unsigned long AA, BB, CC, DD;
unsigned long M[16];
f_size = FileSize( fp);
//
fread_time = f_size/1024 + 1;
unsigned long f, g, temp32;
for( int k = 0; k < fread_time; k ++)
{
count = fread( &buffer, sizeof( char), 1024, fp);
if( count%64 < 56)
{
if( count%64 == 0)
{
round = count/64;
}
else round = count/64 + 1;
}
else
{
round = count/64 + 2;
}
if( (count == 1024 && feof( fp)) || count < 1024)
{
Fill( count, f_size*8);
}
begin = 0;
for(int i = 1; i <= round; i ++)
{
AA = h[0];
BB = h[1];
CC = h[2];
DD = h[3];
GetM( M, begin);
begin += 64;
for( int j = 0; j < 64; j ++)
{
if( 0 <= j && j <= 15)
{
f = (BB & CC) | ((~BB) & DD);
g = j;
}
if( 16 <= j && j <= 31)
{
f = (DD & BB) | ((~DD) & CC);
g = (5*j + 1)%16;
}
if( 32 <= j && j <= 47)
{
f = BB ^ CC ^ DD;
g = (3*j + 5)%16;
}
if( 48 <= j && j <= 63)
{
f = CC ^ (BB | (~DD));
g = (7*j)%16;
}
temp32 = DD;
DD = CC;
CC = BB;
unsigned temp = AA + f + M[g] + k_md5[j];
BB = rol( temp, s[j]) + BB;
AA = temp32;
}
h[0] += AA;
h[1] += BB;
h[2] += CC;
h[3] += DD;
}
}
for( int i = 0; i < 4; i ++)
{
for( int j = 0; j < 4; j ++)
{
md5[i*4 + j] = (h[i]>>((j)*8)) & 0xff;
}
}
return f_size;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -