2011-10-28, 15:22
  #1
Medlem
Jooncs avatar
Ja jag har sökt, men hittade inte det jag letar efter. Jag försöker knäcka en MD5-hash, och har därför skrivit ett program i java som givet en ordlista och en hexsträng försöker matcha MD5 hashen av varje ord i ordlistan med hexsträngen.Jag har laddat hem ett antal ordlistor från nätet (totalt ca 15 gig, 1.5T ord) och gått igenom dem utan någon träff. Så vad jag nu i stället försöker göra är att generera samtliga strängar av längd <= 6 för [a-ö], [A-Ö], [0-9] plus några få specialtecken. Problemet är att genereringen av strängarna (tripple-loop med massa modulo-indexeringar i en char-array) drar hastigheten med ca en faktor 1000 jämfört med radläsning från fil. Så vad jag letar efter är helt enkelt en fil med alla strängar på typen nämnd ovan förgenererade. Finns det någon här som har tillgång till en sådan? (obs: åäö är nödvändigt)
Citera
2011-10-28, 16:15
  #2
Medlem
Varför inte bara flytta koden som genererar strängarna till ett nytt projekt och skapa filen själv?
Citera
2011-10-28, 16:22
  #3
Medlem
Jooncs avatar
För att det skulle ta några år.
Citera
2011-10-28, 17:03
  #4
Medlem
Rätta mig om jag har fel, men en sådan fil skulle bli ((68^6)*6 + (68^5)*5 + ...)/(1024^3) ~= 560 Gb stor.

Programmet för att generera det blir ett tiotal rader kod. Och att köra det går garanterat betydligt fortare än att ladda ned en sådan fil.
Citera
2011-10-28, 17:43
  #5
Medlem
Jooncs avatar
Citat:
Ursprungligen postat av Happy-H
Rätta mig om jag har fel, men en sådan fil skulle bli ((68^6)*6 + (68^5)*5 + ...)/(1024^3) ~= 560 Gb stor.
Nä den skulle bli 68^6+68^5+68^4+68^3+68^2+68 ~= 100 GB, som kan packas till 30.
Citat:
Ursprungligen postat av Happy-H
Programmet för att generera det blir ett tiotal rader kod. Och att köra det går garanterat betydligt fortare än att ladda ned en sådan fil.
Ja det blev ungefär 10 rader, att köra det tar dock över ett år. Det är förmodligen jag som inte skrivit det bra, du får hemskt gärna komma med förslag på hur det kan göras snabbt i java (c, c++, perl och haskell går också bra).
EDIT: förresten måste jag kanske räkna med dubbla storleken, eftersom det blir svårt att hitta teckenkodning på en byte som tillåter å,ä,ö. Finns det någon standard för det? Varför inte? (Off topic jag vet)
EDIT igen: hittade extended ascii som svar på min förra fråga.
__________________
Senast redigerad av Joonc 2011-10-28 kl. 17:57.
Citera
2011-10-28, 19:25
  #6
Moderator
rancors avatar
Så du vet att längden inte är >= 7?
Citera
2011-10-28, 19:35
  #7
Medlem
Ok, här har du ett litet program och en testkörning. (Bara att ändra charset[] till det du vill ha).

Kod:
h@0xEBFE:/tmp$ gcc -lm a.c
h@0xEBFE:/tmp$ time ./a.out > a

real    0m1.705s
user    0m1.520s
sys     0m0.160s
h@0xEBFE:/tmp$ wc -l a
7529537 a

Med 69 tecken i charset skulle det alltså ta: 69^6 / 7529537*1,7/3600 ~= 6.8 timmar på min vps.

Kod:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <math.h>

#define WORD_LENGTH 6

int main(int argc, char *argv[])
{
    char charset[] = "abcdABCD012345";
    char word[WORD_LENGTH + 1];
    size_t charset_size;
    double number_of_words;
    unsigned int i,j,k,char_number;

    charset_size = strlen(charset);
    number_of_words = pow(charset_size, WORD_LENGTH);
    memset(word,0, WORD_LENGTH + 1);

    for(i=0; i<=number_of_words; i++)
    {
        k = i;
        for(j=0; j<WORD_LENGTH; j++)
        {
            char_number = k % charset_size;
            word[j] = charset[char_number];
            k /= charset_size;
        }
        printf("%s\n", word);
    }

    return 0;
}
Citera
2011-10-28, 21:00
  #8
Medlem
Här är en rekursiv variant av Happy-H:s lösning:

Kod:
#include <stdio.h>

void
generate (char charset[], int length, char word[])
{
  int i;
  
  if (length == 0)
    puts (word);
  else
    {
      for (i = 0; charset[i] != 0; i++)
        {
          word[length-1] = charset[i];
          generate (charset, length-1, word);
        }
    }
}

int
main (void)
{
  int length = 6;
  char charset[] = "abcdABCD012345";
  char word[length+1];
  word[length] = 0;

  generate (charset, length, word);

  return 0;
}

Kod:
$ cc gen.c
$ time ./a.out > output

real	0m0.372s
user	0m0.210s
sys	0m0.083s
$ wc -l output
7529536 output
Citera
2011-10-28, 21:05
  #9
Medlem
Jooncs avatar
Citat:
Ursprungligen postat av rancor
Så du vet att längden inte är >= 7?
Nej det gör jag inte, problemet är att det kommer ta för lång tid med 7.

Citat:
Ursprungligen postat av Happy-H
Ok, här har du ett litet program och en testkörning. (Bara att ändra charset[] till det du vill ha).

Kod:
h@0xEBFE:/tmp$ gcc -lm a.c
h@0xEBFE:/tmp$ time ./a.out > a

real    0m1.705s
user    0m1.520s
sys     0m0.160s
h@0xEBFE:/tmp$ wc -l a
7529537 a

Med 69 tecken i charset skulle det alltså ta: 69^6 / 7529537*1,7/3600 ~= 6.8 timmar på min vps.

Kod:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <math.h>

#define WORD_LENGTH 6

int main(int argc, char *argv[])
{
    char charset[] = "abcdABCD012345";
    char word[WORD_LENGTH + 1];
    size_t charset_size;
    double number_of_words;
    unsigned int i,j,k,char_number;

    charset_size = strlen(charset);
    number_of_words = pow(charset_size, WORD_LENGTH);
    memset(word,0, WORD_LENGTH + 1);

    for(i=0; i<=number_of_words; i++)
    {
        k = i;
        for(j=0; j<WORD_LENGTH; j++)
        {
            char_number = k % charset_size;
            word[j] = charset[char_number];
            k /= charset_size;
        }
        printf("%s\n", word);
    }

    return 0;
}
Tack så mycket, ska testa det när jag kommer hem på söndag!
Citera
2011-10-28, 22:01
  #10
Moderator
rancors avatar
http://project-rainbowcrack.com/index.htm#download

Låt din gpu få arbeta lite =)
Citera
2011-10-28, 23:38
  #11
Medlem
Jooncs avatar
Citat:
Ursprungligen postat av unparsed
Här är en rekursiv variant av Happy-H:s lösning:

Kod:
#include <stdio.h>

void
generate (char charset[], int length, char word[])
{
  int i;
  
  if (length == 0)
    puts (word);
  else
    {
      for (i = 0; charset[i] != 0; i++)
        {
          word[length-1] = charset[i];
          generate (charset, length-1, word);
        }
    }
}

int
main (void)
{
  int length = 6;
  char charset[] = "abcdABCD012345";
  char word[length+1];
  word[length] = 0;

  generate (charset, length, word);

  return 0;
}

Kod:
$ cc gen.c
$ time ./a.out > output

real	0m0.372s
user	0m0.210s
sys	0m0.083s
$ wc -l output
7529536 output
Nice, jag missade det här inlägget. ska också testas.
Citat:
Ursprungligen postat av rancor
http://project-rainbowcrack.com/index.htm#download

Låt din gpu få arbeta lite =)
Tack, men det känns roligare att försöka göra någonting själv (om jag nu fortfarande kan hävda det efter hjälpen från Happy-H och unparsed).
__________________
Senast redigerad av Joonc 2011-10-28 kl. 23:46.
Citera
2011-10-30, 12:02
  #12
Medlem
Jooncs avatar
Tack igen unparsed och Happy-H. Jag körde de för längden 5 igår på en 64-bits laptop med win 7 och det tog 5 minuter. Jag kör det just nu på min 32-bits stationära med xp och "online stopwatch" som jag satte igång samtidigt visar just 32 minuter, och den är inte riktigt klar ännu. Jag vet inte exakt vad detta beror på men jag antar att om jag vill generera av längden 6 också måste jag använda en annan dator.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in