|
|
- #include <mpi.h>
- #include <stdio.h>
- #include <iostream>
- #include <string>
- #include <stdlib.h>
- #include <string.h>
- #include <stdint.h>
- #include <math.h>
- #include "genSha1.h"
- #include "Ttiming.h"
-
- using namespace std;
-
- #define lexSize 64 //rozmiar słownika musi być potęgą liczby 2!!!!
- #define maxStrSize 10 //maskymalny rozmiar szukanego hasła, nie moze być wiekszy niz 10!!
- #define minStrSize 2 //minimalny rozmiar szukanego hasła od 1 do maxStrSize
- #define offset 6 //ile bitów potrzeba do zapisania liczby lexSize-1 np lexSize=4 to wtedy offset = 2;
- #define mask 0x3f //np dla maxKomb zapisanego na 64bitach to jest 58 zer i 6 (czyli offset) jedynek: 0000000 0000000 0000000 0000000 0000000 0000000 0000000 00111111
-
-
- //"słownik"
- char lex[lexSize] = {'a','b','c','d','e','f','g','h',
- 'i','j','k','l','m','n','o','p',
- 'r','s','t','u','v','w','x','y',
- 'z','A','B','C','D','E','F','G',
- 'H','I','J','K','L','M','N','O',
- 'P','R','S','T','U','V','W','X',
- 'Y','Z','0','1','2','3','4','5',
- '6','7','8','9','_',' ','-','!',};
-
-
- int main(int argc, char** argv) {
-
-
- if(argc <2){
- cerr << "Usage: " << argv[0] << " <hash>" << endl;
- exit(1);
- }
-
- MPI_Init(NULL, NULL);
-
- int size,rank,strSize;
- short success = 1,sumSuccess = 1;
- TTiming czasomierzacz;
-
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-
- uint64_t i; //licznik, 64 bit-owy bo maxStrSize * offset = 10 * 6 = 60 bit; 4 bity w "zapasie" :-)
- uint64_t maxKomb; //maxKomb to maksymalna ilosć kombinacji hasła = lexSize ^ strSize;
-
- char *str, *result;
- result = new char[41];
- str = new char[maxStrSize];
-
- if (!rank) czasomierzacz.Begin();
-
- for(strSize = minStrSize;strSize<=maxStrSize;strSize++){ //petla generujaca jaka ma być długość hasła z którego bedzie generowany hash
- maxKomb = pow(lexSize,strSize);//tak, wiem że potega ale w całym programie wykona się maksymalnie tyle razy: ilość porcesów *(maxStrSize - minStrSize)
- i = rank;
-
- while(i<maxKomb){//generowanie różnych haseł
- for(int j=0;j<strSize;j++){
- str[j] = lex[(i >> (offset*j)) & mask];
- }
-
- sha1((unsigned char*)str,strSize,result); //obliczanie hash z wygenerowanego wcześniej hasła
-
- if(strcasecmp(argv[1],result) == 0){ //znalazłem odpowiedz 109
- success = 0; //ustwaiem zmienna success na 0
- cout<<endl<<" Złamałem hasha: ";
- for(int l=0;l<strSize;l++) cout<<str[l];
- cout<<endl;
- }
-
- MPI_Allreduce(&success,&sumSuccess,1,MPI::SHORT,MPI::BAND,MPI_COMM_WORLD); //robię bitowe AND na zmiennej 'success'. wyjdzie 0 gdy 'success' z któregokolwiek procesu jest równy 0
- if(!sumSuccess) goto stop; //sumSuccess = 0 wiec ten proces się kończy.
-
- i+=size;
- }
- }
-
- stop:
-
- if (!rank) cout<<" Czas = "<<czasomierzacz.End()<<" ms"<<endl<<endl;
-
- delete[] result;
- delete[] str;
-
- MPI_Finalize();
- }
-
|