📄 md5cc.cpp
字号:
//--------------------------------------------------------------------
//
// MD5 Crack with Collisions
//
// by marstone@marstone.net, 2006.01.10
//
//--------------------------------------------------------------------
#ifndef MD
#define MD 5
#endif
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <conio.h>
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]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -