Openmp在暴力猜测MD5源字串一例
3681 点击·0 回帖
![]() | ![]() | |
![]() | //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(); } | |
![]() | ![]() |