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]); }