You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

85 lines
2.5 KiB

#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;
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];
czasomierzacz.Begin();
maxKomb = pow(lexSize,minStrSize-1);
for(strSize = minStrSize;strSize<=maxStrSize;strSize++){ //petla generujaca jaka ma być długość hasła z którego bedzie generowany hash
maxKomb *= lexSize;
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
cout<<endl<<" Złamałem hasha: ";
for(int l=0;l<strSize;l++) cout<<str[l];
cout<<endl;
cout<<" Czas = "<<czasomierzacz.End()<<" ms"<<endl<<endl;
MPI_Abort(MPI_COMM_WORLD, MPI_SUCCESS);
}
i+=size;
}
}
if (!rank) cout << "Nie znaleziono!!!" << endl << endl;
delete[] result;
delete[] str;
MPI_Finalize();
}