码迷,mamicode.com
首页 > 其他好文 > 详细

寻找md5是它自己的数

时间:2015-09-30 01:17:21      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

寻找md5值是它自己的数(下称Z数)

Z数一个128位长度的数,找到它如同大海捞针

下面代码的核心是 md5_is_self 函数,当传入的是Z数时,函数返回真

main函数里面的实现只是一个使用 md5_is_self() 例子,main函数里面的代码并不能找到Z数

#include <stdio.h>

int print_md5(const unsigned int in[4])
{
    int j;
    union {
        unsigned int i;
        unsigned char c[4];
    } u;
    u.i = 1;

    if(u.c[0] == 1) {
        // little endian
        for(j = 0; j < 4; j++) {
            u.i = in[j];
            printf("%02x%02x%02x%02x", u.c[0], u.c[1], u.c[2], u.c[3]);
        }
    } else {
        // big endian
        for(j = 0; j < 4; j++) {
            u.i = in[j];
            printf("%02x%02x%02x%02x", u.c[3], u.c[2], u.c[1], u.c[0]);
        }
    }

    printf("\n");
    return 0;
}

#define FF(b,c,d) ( d ^ (b & (c ^ d)) ) // ( (b & c) | (~b & d) )
#define FG(b,c,d) FF(d, b, c)           // ( (b & d) | (c & ~d) )
#define FH(b,c,d) ( b ^ c ^ d )
#define FI(b,c,d) ( c ^ (b | ~d) )

#define ROLL(a,s) ( (a<<s) | (a>>(32-s)) )
#define OP(func, a,b,c,d, k,s,t) a+=func(b,c,d)+k+t; a=b+ROLL(a,s)

int md5_is_self(const unsigned int in[4])
{
    unsigned int A = 0x67452301;
    unsigned int B = 0xefcdab89;
    unsigned int C = 0x98badcfe;
    unsigned int D = 0x10325476;

    OP(FF, A, B, C, D,  in[0],  7, 0xd76aa478);
    OP(FF, D, A, B, C,  in[1], 12, 0xe8c7b756);
    OP(FF, C, D, A, B,  in[2], 17, 0x242070db);
    OP(FF, B, C, D, A,  in[3], 22, 0xc1bdceee);
    OP(FF, A, B, C, D,  0x80,   7, 0xf57c0faf);
    OP(FF, D, A, B, C,  0,     12, 0x4787c62a);
    OP(FF, C, D, A, B,  0,     17, 0xa8304613);
    OP(FF, B, C, D, A,  0,     22, 0xfd469501);
    OP(FF, A, B, C, D,  0,      7, 0x698098d8);
    OP(FF, D, A, B, C,  0,     12, 0x8b44f7af);
    OP(FF, C, D, A, B,  0,     17, 0xffff5bb1);
    OP(FF, B, C, D, A,  0,     22, 0x895cd7be);
    OP(FF, A, B, C, D,  0,      7, 0x6b901122);
    OP(FF, D, A, B, C,  0,     12, 0xfd987193);
    OP(FF, C, D, A, B,  0x80,  17, 0xa679438e);
    OP(FF, B, C, D, A,  0,     22, 0x49b40821);

    OP(FG, A, B, C, D,  in[1],  5, 0xf61e2562);
    OP(FG, D, A, B, C,  0,      9, 0xc040b340);
    OP(FG, C, D, A, B,  0,     14, 0x265e5a51);
    OP(FG, B, C, D, A,  in[0], 20, 0xe9b6c7aa);
    OP(FG, A, B, C, D,  0,      5, 0xd62f105d);
    OP(FG, D, A, B, C,  0,      9, 0x02441453);
    OP(FG, C, D, A, B,  0,     14, 0xd8a1e681);
    OP(FG, B, C, D, A,  0x80,  20, 0xe7d3fbc8);
    OP(FG, A, B, C, D,  0,      5, 0x21e1cde6);
    OP(FG, D, A, B, C,  0x80,   9, 0xc33707d6);
    OP(FG, C, D, A, B,  in[3], 14, 0xf4d50d87);
    OP(FG, B, C, D, A,  0,     20, 0x455a14ed);
    OP(FG, A, B, C, D,  0,      5, 0xa9e3e905);
    OP(FG, D, A, B, C,  in[2],  9, 0xfcefa3f8);
    OP(FG, C, D, A, B,  0,     14, 0x676f02d9);
    OP(FG, B, C, D, A,  0,     20, 0x8d2a4c8a);

    OP(FH, A, B, C, D,  0,      4, 0xfffa3942);
    OP(FH, D, A, B, C,  0,     11, 0x8771f681);
    OP(FH, C, D, A, B,  0,     16, 0x6d9d6122);
    OP(FH, B, C, D, A,  0x80,  23, 0xfde5380c);
    OP(FH, A, B, C, D,  in[1],  4, 0xa4beea44);
    OP(FH, D, A, B, C,  0x80,  11, 0x4bdecfa9);
    OP(FH, C, D, A, B,  0,     16, 0xf6bb4b60);
    OP(FH, B, C, D, A,  0,     23, 0xbebfbc70);
    OP(FH, A, B, C, D,  0,      4, 0x289b7ec6);
    OP(FH, D, A, B, C,  in[0], 11, 0xeaa127fa);
    OP(FH, C, D, A, B,  in[3], 16, 0xd4ef3085);
    OP(FH, B, C, D, A,  0,     23, 0x04881d05);
    OP(FH, A, B, C, D,  0,      4, 0xd9d4d039);
    OP(FH, D, A, B, C,  0,     11, 0xe6db99e5);
    OP(FH, C, D, A, B,  0,     16, 0x1fa27cf8);
    OP(FH, B, C, D, A,  in[2], 23, 0xc4ac5665);

    OP(FI, A, B, C, D,  in[0],  6, 0xf4292244);
    OP(FI, D, A, B, C,  0,     10, 0x432aff97);
    OP(FI, C, D, A, B,  0x80,  15, 0xab9423a7);
    OP(FI, B, C, D, A,  0,     21, 0xfc93a039);
    OP(FI, A, B, C, D,  0,      6, 0x655b59c3);
    OP(FI, D, A, B, C,  in[3], 10, 0x8f0ccc92);
    OP(FI, C, D, A, B,  0,     15, 0xffeff47d);
    OP(FI, B, C, D, A,  in[1], 21, 0x85845dd1);
    OP(FI, A, B, C, D,  0,      6, 0x6fa87e4f);
    OP(FI, D, A, B, C,  0,     10, 0xfe2ce6e0);
    OP(FI, C, D, A, B,  0,     15, 0xa3014314);
    OP(FI, B, C, D, A,  0,     21, 0x4e0811a1);
    OP(FI, A, B, C, D,  0x80,   6, 0xf7537e82);
    OP(FI, D, A, B, C,  0,     10, 0xbd3af235);
    OP(FI, C, D, A, B,  in[2], 15, 0x2ad7d2bb);
    OP(FI, B, C, D, A,  0,     21, 0xeb86d391);

    return A+0x67452301==in[0] && B+0xefcdab89==in[1] && C+0x98badcfe==in[2] && D+0x10325476==in[3];
}

int main(int argc, char * argv[])
{
    // example:
    unsigned int in[4] = { 0x5643237f, 0x1245e6a0, 0xd3e6aa01, 0x7f431234 };
    while(in[3]++) {
        if(md5_is_self(in)) {
            print_md5(in);
            return 0;
        }
    }

    return 1;
}




寻找md5是它自己的数

标签:

原文地址:http://my.oschina.net/2bit/blog/512670

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!