www.pudn.com > md5cc.zip > md5cc.cpp


//-------------------------------------------------------------------- 
// 
// MD5 Crack with Collisions 
// 
// by marstone@marstone.net, 2006.01.10 
// 
//-------------------------------------------------------------------- 
 
#ifndef MD 
#define MD 5 
#endif 
 
#include  
#include  
#include  
#include  
 
extern "C" 
{ 
	#include "global.h" 
	#if MD == 2 
	#include "md2.h" 
	#endif 
	#if MD == 4 
	#include "md4.h" 
	#endif 
	#if MD == 5 
	#include "md5.h" 
	#endif 
} 
 
/* Length of test block, number of test blocks. 
 */ 
#define TEST_BLOCK_LEN 1000 
#define TEST_BLOCK_COUNT 1000 
 
static void MDString PROTO_LIST ((char *)); 
static void MDTimeTrial PROTO_LIST ((void)); 
static void MDTestSuite PROTO_LIST ((void)); 
static void MDFile PROTO_LIST ((char *)); 
static void MDFilter PROTO_LIST ((void)); 
static void MDPrint PROTO_LIST ((unsigned char [16])); 
 
#if MD == 2 
#define MD_CTX MD2_CTX 
#define MDInit MD2Init 
#define MDUpdate MD2Update 
#define MDFinal MD2Final 
#endif 
#if MD == 4 
#define MD_CTX MD4_CTX 
#define MDInit MD4Init 
#define MDUpdate MD4Update 
#define MDFinal MD4Final 
#endif 
#if MD == 5 
#define MD_CTX MD5_CTX 
#define MDInit MD5Init 
#define MDUpdate MD5Update 
#define MDFinal MD5Final 
#endif 
 
unsigned int md5coll0[32] = { 
0x3a41104a, 0x5281960d, 0x42e95e09, 0x0d89a60f, 
0xb63d4ddc, 0x299e5df2, 0xb61a17cd, 0xeb460dab, 
0x0533ecc5, 0xa27279fd, 0x9d6cb1bb, 0x13e11781, 
0x0c3bd0cc, 0x8f4e9cd7, 0xcccab810, 0xa82669b5, 
0xd80fddf2, 0xee049d23, 0xbb92ef73, 0xdd17104b, 
0x1628ae7d, 0x1c78627e, 0x25a8b538, 0xe05e2850, 
0x4cff9809, 0x26235db1, 0xc23fb1f6, 0x838a9055, 
0x2dda9cd0, 0x26dba791, 0xa5188066, 0xf1e08a33, 
}; 
 
unsigned int md5coll1[32] = { 
0x3a41104a, 0x5281960d, 0x42e95e09, 0x0d89a60f, 
0x363d4ddc, 0x299e5df2, 0xb61a17cd, 0xeb460dab, 
0x0533ecc5, 0xa27279fd, 0x9d6cb1bb, 0x13e19781, 
0x0c3bd0cc, 0x8f4e9cd7, 0x4ccab810, 0xa82669b5, 
0xd80fddf2, 0xee049d23, 0xbb92ef73, 0xdd17104b, 
0x9628ae7d, 0x1c78627e, 0x25a8b538, 0xe05e2850, 
0x4cff9809, 0x26235db1, 0xc23fb1f6, 0x838a1055, 
0x2dda9cd0, 0x26dba791, 0x25188066, 0xf1e08a33, 
}; 
 
 
 
unsigned int m0[32] = { 
0x02dd31d1, 0xc4eee6c5, 0x069a3d69, 0x5cf9af98, 
0x87b5ca2f, 0xab7e4612, 0x3e580440, 0x897ffbb8, 
0x0634ad55, 0x02b3f409, 0x8388e483, 0x5a417125, 
0xe8255108, 0x9fc9cdf7, 0xf2bd1dd9, 0x5b3c3780, 
0xd11d0b96, 0x9c7b41dc, 0xf497d8e4, 0xd555655a,  
0xc79a7335, 0x0cfdebf0, 0x66f12930, 0x8fb109d1, 
0x797f2775, 0xeb5cd530, 0xbaade822, 0x5c15cc79, 
0xddcb74ed, 0x6dd3c55f, 0xd80a9bb1, 0xe3a7cc35, 
}; 
 
unsigned int m1[32] = { 
0x02dd31d1, 0xc4eee6c5, 0x069a3d69, 0x5cf9af98, 
0x87b5ca2f, 0xab7e4612, 0x3e580440, 0x897ffbb8, 
0x0634ad55, 0x02b3f409, 0x8388e483, 0x5a417125, 
0xe8255108, 0x9fc9cdf7, 0xf2bd1dd9, 0x5b3c3780, 
0x313e82d8, 0x5b8f3456, 0xd4ac6dae, 0xc619c936, 
0xb4e253dd, 0xfd03da87, 0x06633902, 0xa0cd48d2, 
0x42339fe9, 0xe87e570f, 0x70b654ce, 0x1e0da880, 
0xbc2198c6, 0x9383a8b6, 0x2b65f996, 0x702af76f, 
}; 
unsigned int m2[32] = { 
0x02dd31d1, 0xc4eee6c5, 0x069a3d69, 0x5cf9af98,  
0x07b5ca2f, 0xab7e4612, 0x3e580440, 0x897ffbb8, 
0x0634ad55, 0x02b3f409, 0x8388e483, 0x5a41f125,  
0xe8255108, 0x9fc9cdf7, 0x72bd1dd9, 0x5b3c3780, 
0x313e82d8, 0x5b8f3456, 0xd4ac6dae, 0xc619c936,  
0x34e253dd, 0xfd03da87, 0x06633902, 0xa0cd48d2, 
0x42339fe9, 0xe87e570f, 0x70b654ce, 0x1e0d2880, 
0xbc2198c6, 0x9383a8b6, 0xab65f996, 0x702af76f, 
}; 
 
int main(int argc, char *argv[]) 
{ 
	printf("md5cc 0.1, by marstone@marstone.net\n"); 
 
	 
	unsigned char result[16]; 
	MD_CTX context; 
 
	// char string[16]; 
	// strcpy(string, "634634"); 
	// unsigned int len = strlen(string); 
	 
	//MDString("0000"); 
 
	////unsigned int m3[2] = {0x30303030, 0x30003030}; 
	//unsigned int m3[1] = {0x30303030}; 
	//MDInit(&context); 
	//MDUpdate(&context, (unsigned char*)m3, 4); 
	//MDFinal(result, &context); 
	//printf("MD%d(m3) = ", MD, result); 
	//MDPrint(result); 
	 
	unsigned int len = 128; 
	unsigned int l = 128; 
	 
 
 
	MDInit(&context); 
	MDUpdate(&context, (unsigned char*)md5coll0, l); 
	MDFinal(result, &context); 
	printf("MD%d(md5coll0) = ", MD, result); 
	MDPrint(result); 
 
	printf("\n"); 
 
	MDInit(&context); 
	MDUpdate(&context, (unsigned char*)md5coll1, l); 
	MDFinal(result, &context); 
	printf("MD%d(md5coll1) = ", MD, result); 
	MDPrint(result); 
 
	printf("\n"); 
	printf("\n"); 
 
	MDInit(&context); 
	MDUpdate(&context, (unsigned char*)m0, len); 
	MDFinal(result, &context); 
	printf("MD%d(m0) = ", MD, result); 
	MDPrint(result); 
 
	printf("\n"); 
	printf("\n"); 
 
	MDInit(&context); 
	MDUpdate(&context, (unsigned char*)m1, len); 
	MDFinal(result, &context); 
	printf("MD%d(m1) = ", MD, result); 
	MDPrint(result); 
 
	printf("\n"); 
 
	MDInit(&context); 
	MDUpdate(&context, (unsigned char*)m2, len); 
	MDFinal(result, &context); 
	printf("MD%d(m2) = ", MD, result); 
	MDPrint(result); 
 
	getch(); 
	return 0; 
} 
 
/* Digests a string and prints the result. 
 */ 
static void MDString (char *string) 
{ 
	MD_CTX context; 
	unsigned char digest[16]; 
	unsigned int len = strlen(string); 
 
	MDInit(&context); 
	MDUpdate(&context, (unsigned char*)string, len); 
	MDFinal(digest, &context); 
 
	printf("MD%d (\"%s\") = ", MD, string); 
	MDPrint(digest); 
	printf("\n"); 
} 
 
/* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte 
  blocks. 
 */ 
static void MDTimeTrial () 
{ 
	MD_CTX context; 
	time_t endTime, startTime; 
	unsigned char block[TEST_BLOCK_LEN], digest[16]; 
	unsigned int i; 
	printf("MD%d time trial. Digesting %d %d-byte blocks ...", MD, 
		TEST_BLOCK_LEN, TEST_BLOCK_COUNT); 
 
	/* Initialize block */ 
	for (i = 0; i < TEST_BLOCK_LEN; i++) 
		block[i] = (unsigned char)(i & 0xff); 
 
	/* Start timer */ 
	time (&startTime); 
 
	/* Digest blocks */ 
	MDInit (&context); 
	for (i = 0; i < TEST_BLOCK_COUNT; i++) 
		MDUpdate (&context, block, TEST_BLOCK_LEN); 
	MDFinal (digest, &context); 
 
	/* Stop timer */ 
	time (&endTime); 
 
	printf(" done\n"); 
	printf("Digest = "); 
	MDPrint (digest); 
	printf("\nTime = %ld seconds\n", (long)(endTime-startTime)); 
	printf("Speed = %ld bytes/second\n", 
	(long)TEST_BLOCK_LEN * (long)TEST_BLOCK_COUNT/(endTime-startTime)); 
} 
 
/* Digests a reference suite of strings and prints the results. 
 */ 
static void MDTestSuite () 
{ 
	printf("MD%d test suite:\n", MD); 
 
	MDString(""); 
	MDString("a"); 
	MDString("abc"); 
	MDString("message digest"); 
	MDString("abcdefghijklmnopqrstuvwxyz"); 
	MDString("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); 
	MDString("12345678901234567890123456789012345678901234567890123456789012345678901234567890"); 
} 
 
/* Digests a file and prints the result.*/ 
static void MDFile (char* filename) 
{ 
	FILE *file; 
	MD_CTX context; 
	int len; 
	unsigned char buffer[1024], digest[16]; 
 
	if ((file = fopen (filename, "rb")) == NULL) 
		printf ("%s can't be opened\n", filename); 
	else { 
		MDInit (&context); 
		while (len = fread (buffer, 1, 1024, file)) 
		MDUpdate (&context, buffer, len); 
		MDFinal (digest, &context); 
 
		fclose (file); 
 
		printf ("MD%d (%s) = ", MD, filename); 
		MDPrint (digest); 
		printf ("\n"); 
	} 
} 
 
/* Digests the standard input and prints the result. 
 */ 
static void MDFilter () 
{ 
	MD_CTX context; 
	int len; 
	unsigned char buffer[16], digest[16]; 
 
	MDInit (&context); 
	while (len = fread (buffer, 1, 16, stdin)) 
		MDUpdate (&context, buffer, len); 
	MDFinal (digest, &context); 
 
	MDPrint (digest); 
	printf ("\n"); 
} 
 
/* Prints a message digest in hexadecimal. 
 */ 
static void MDPrint (unsigned char digest[16]) 
{ 
	unsigned int i; 
 
	for (i = 0; i < 16; i++) 
		printf ("%02x", digest[i]); 
}