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.6 KiB

7 years ago
  1. #include <mpi.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include <string>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <stdint.h>
  8. #include <math.h>
  9. #include "genSha1.h"
  10. using namespace std;
  11. #define lexSize 64 //rozmiar słownika musi być potęgą liczby 2!!!!
  12. #define maxStrSize 10 //maskymalny rozmiar szukanego hasła, nie moze być wiekszy niz 10!!
  13. #define minStrSize 3 //minimalny rozmiar szukanego hasła od 1 do maxStrSize
  14. #define offset 6 //ile bitów potrzeba do zapisania liczby lexSize-1 np lexSize=4 to wtedy offset = 2;
  15. #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
  16. //"słownik"
  17. char lex[lexSize] = {'a','b','c','d','e','f','g','h',
  18. 'i','j','k','l','m','n','o','p',
  19. 'r','s','t','u','v','w','x','y',
  20. 'z','A','B','C','D','E','F','G',
  21. 'H','I','J','K','L','M','N','O',
  22. 'P','R','S','T','U','V','W','X',
  23. 'Y','Z','0','1','2','3','4','5',
  24. '6','7','8','9','_',' ','-','!',};
  25. int main(int argc, char** argv) {
  26. if(argc <2){
  27. cerr << "Usage: " << argv[0] << " <hash>" << endl;
  28. exit(1);
  29. }
  30. MPI_Init(NULL, NULL);
  31. int size,rank,strSize;
  32. MPI_Comm_size(MPI_COMM_WORLD, &size);
  33. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  34. uint64_t i; //licznik, 64 bit-owy bo maxStrSize * offset = 10 * 6 = 60 bit; 4 bity w "zapasie" :-)
  35. uint64_t maxKomb; //maxKomb to maksymalna ilosć kombinacji hasła = lexSize ^ strSize;
  36. char *str, *result;
  37. result = new char[41];
  38. str = new char[maxStrSize];
  39. for(strSize = minStrSize;strSize<=maxStrSize;strSize++){ //petla generujaca jaka ma być długość hasła z którego bedzie generowany hash
  40. maxKomb = pow(lexSize,strSize);//tak wiem że potega ale w całym programie wykona się maksymalnie tyle razy: ilość porcesów *(maxStrSize - minStrSize)
  41. i = rank;
  42. while(i<maxKomb){//generowanie różnych haseł
  43. for(int j=0;j<strSize;j++){
  44. str[j] = lex[(i >> (offset*j)) & mask];
  45. }
  46. sha1((unsigned char*)str,strSize,result); //obliczanie hash z wygenerowanego wcześniej hasła
  47. if(memcmp(argv[1],result,41) == 0 ){ //prównuje hash obliczony z tym podanym jako argument programu
  48. //znaleziono hasha!!!
  49. cout<<"Znalazłem!!!"<<endl;
  50. for(int l=0;l<strSize;l++) cout<<str[l];
  51. cout<<endl;
  52. MPI_Abort(MPI_COMM_WORLD,-1); //kończe wszystkie watki; działa ale to mało elegancka metoda
  53. }
  54. i+=size;
  55. }
  56. }
  57. delete[] result; //gdy bedzie wywołane MPI_Abort to i tak to nie zdziała, no ale jest...
  58. delete[] str;
  59. MPI_Finalize();
  60. }