灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3264回复:0

[C++技术]Openmp在暴力猜测MD5源字串一例

楼主#
更多 发布于:2012-09-06 11:34

//gcc -fopenmp -O2 -static -s omp_pwd_md5.c md5.c -o omp_pwd_md5.exe
#include <stdio.h>
#include "md5.h"
#include <omp.h>

#define PASSWD_MAXLEN 32
#define PASSWD_SET_SIZE 36
const char *passwd_words = "0123456789abcdefghijklmnopqrstuvwxyz_-.,";
const char *real_pass_digest = "\x5d\x41\x40\x2a\xbc\x4b\x2a\x76\xb9\x71\x9d\x91\x10\x17\xc5\x92";
int compare_pass(int passwd_len , char *passwd)
{
    int i;
    int match = 0;
    unsigned int *p1, *p2;
    p2 = (unsigned int *)real_pass_digest;
    //printf("Guess Password: %s", passwd);
    md5_state_t ms;
    md5_byte_t digest[16];
    md5_init(;ms);
    md5_append(;ms, passwd, passwd_len);
    md5_finish(;ms, digest);
    p1 = (unsigned int *)digest;
    for(i = 0; i < 4; i++)
    {
        if(p1 == p2) match++;
    }
    i = 0;
    if(match == 4)
    {
        i = 1;
        printf("String: %s -- Matched!", passwd);
    }
    return i;
}

void passwd_gen()
{
    int core_nums = omp_get_num_procs();
    printf("Core Number:%d\n", core_nums);
    int i, finded = 0;
    int len = 0, passwd_count = 0;
    int PP[PASSWD_MAXLEN];
    int *passlen = (int *)malloc(sizeof(int)*core_nums);
    char *passwd = (char *)malloc(PASSWD_MAXLEN * core_nums);
    for(i = 0; i < PASSWD_MAXLEN; i++)
    {
        PP = 0;
        passwd = 0;
    }
    int pos = 0;
    while(1)
    {
        PP[pos]++;
        if(PP[pos] == PASSWD_SET_SIZE)
        {
            PP[pos] = 0;pos++;
            continue;
        }
        else
        {
            len = pos > len ? pos : len ;
            pos = 0;
            for(i = 0; i < len + 1; i++) passwd[PASSWD_MAXLEN*passwd_count + i] = passwd_words[ PP ];
            passlen[passwd_count] = len + 1;
            passwd_count++;
            if(passwd_count == core_nums)
            {
                passwd_count = 0;
                #pragma omp parallel for
                for(i = 0; i < core_nums; i++)
                {
                    finded += compare_pass(passlen, passwd + PASSWD_MAXLEN*i);
                }
                if(finded) break;
            }
        }
    }
    free(passwd);
    free(passlen);
}

int main( int argc, char *argv[] )
{
    passwd_gen();
}


喜欢0 评分0
游客

返回顶部