Openmp在暴力猜测MD5源字串一例

来源:互联网 发布:mtv分享精灵软件 编辑:程序博客网 时间:2024/05/19 20:46
//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 36const 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[i] == p2[i]) 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[i] = 0;passwd[i] = 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[i] ];passlen[passwd_count] = len + 1;passwd_count++;if(passwd_count == core_nums){passwd_count = 0;#pragma omp parallel forfor(i = 0; i < core_nums; i++){finded += compare_pass(passlen[i], passwd + PASSWD_MAXLEN*i);}if(finded) break;}}}free(passwd);free(passlen);}int main( int argc, char *argv[] ){passwd_gen();}

原创粉丝点击