Jump to content
Sign in to follow this  
ohgr

jelszó? generátor

Recommended Posts

Üdv Mindenkinek!

 

A következő problémára kellene megoldás, ill. segítség:

Olyan jelszó lista generátor-t szeretnék létrehozni, ami

adott hosszúságú karakterláncot hoz létre, úgy, hogy

minden karaktert csak egyszer használ fel egy karakterláncon belül

miközben az összes létező variációt létrehozza, a kimenete

pedig egy .txt kiterjesztésű fájl lenne.

(Tehát, pl. 8 karakter hosszúságú karakterláncban a-z

és 0-9 karakterek felhasználásával pl. ilyen 'jelszavakat'

írna a kimenetbe: a1c9efgh, bcds4a8z ... , vagyis

egy karakter sem ismétlődik a karakterláncon belül)

Share this post


Link to post
Share on other sites

Nem tudom milyen nyelven akarod, de nézz szét az adott nyelv referenciájában, általában ilyen feladatokra vannak függvények, ha nem is az egész problémát oldja meg, de megkönnyíti az elkészítést.

 

Egyébként ha teljesen elemi úton akarod megírni, akkor sem olyan nehéz.

Én úgy csinálnám, hogy a megadott hosszúságon elindulva randomgenerátorral kiválaszt egy karaktert egy megadott listából (pl 0-z a te esetedben) és az első olyan random kiválasztott karakter hozzáfűzöd (a kezdetben üres) karakterlánchoz, ami nem szerepel még előtte az adott karaktersorozatban (ezt ugye ellenőrnizni kell minden egyes hozzáfűzés előtt). Aztán mielőtt a txt-be másolnád, azt is le kell ellenőrizni, hogy a txt-ben nincs-e már bent az adott karaktersorozat (ez egy újabb keresés és csekkolás), ha nincs akkor beírja.

Biztosan van ennél sokkal optimalizáltabb megoldás is, pl randomgeneráto helyett konkrét algoritmus, de most ez ugrott be legkönyebb megvalósításként.

Share this post


Link to post
Share on other sites

Köszönöm.

Én egyébként úgy csinálnám, hogy egy tömbben eltárolnám a karakterláncot (a-z; 0-9),

majd innen karakterenként kiolvasva kerünének egymás után a már 8 karakteres

'jelszavak' a txt állományba. Így minden variáció létrejönne.

A kérdés az, hogy lehet megoldani azt, hogy adott hosszúságú karakterláncon belül

minden karakter csak egyszer szerepeljen, ugyanakkor az összes variáció meglegyen.

Share this post


Link to post
Share on other sites

Én megírtam az egészet Python-ban gyors, ha érdekel beteszem a forráskódot.

 

"A kérdés az, hogy lehet megoldani azt, hogy adott hosszúságú karakterláncon belül

minden karakter csak egyszer szerepeljen, ugyanakkor az összes variáció meglegyen."

 

A dolog nem nehéz, megadsz egy felső határt, és szép lassan fűzöd fel a következő karaktereket, de közben felfűzés előtt lecsekkolod, hogy szerepel-e már a karakter az addig meglévő karakterláncban, ha nem, akkor fűzés, ha igen, akkor jöhet a kövi random választás.

Hogy az össze variáció meglegyen, ahhoz ki kell számolnod, hogy mennyi a lehetséges variációk száma, és addig mész a ciklussal, amíg azt el nem éred, persze csak azt a jelszót írod ki a fájlba, amit előtte lecsekkoltál, hogy nincs-e már bent a jelszavak listájában.

 

http://paste.ubuntu.com/1637111/

 

Itt a forráskód, szépen kommenteltem végig, így remélem már menni fog egyéb nyelven is. Egyébként mi a célnyelv? Vagy pszeudokódot kell írnod?

 

http://www.asciitable.com/

 

Egy kis segítség a kód elejének megértéséhez, hogy mik azok a számok ott, ha nem értenéd esetleg :)

Share this post


Link to post
Share on other sites

Köszönöm.

Jó az elképzelés, de...sajnos nagyon lassú...

... közel tíz perc alatt csupán 246.500 jelszó készült el...

Így azt mondom: a random megoldás nem jó, sorba kell haladni...

Share this post


Link to post
Share on other sites

8 változó, kezdőérték az első 8 számjegy, majd szépen haladsz sorban, ahogy a valóságban fejben is csinálnád: 01234567, 01234568, stb, csak azt kell végiggondolni, hogy mikor mit léptessen tovább, majd holnap foglalkozom vele egy kicsit.

Share this post


Link to post
Share on other sites

Nos... van egy ilyen kódom C-ben:

 

#include <string.h>
#include <windows.h>
#include <stdio.h>
#include <math.h>

typedef unsigned long long int64;


// config
char configfile[] = "settings.ini";
char outputfile[ 1<<7 ];
char charset[ 1 << 9 ];
int maxPWLength = 5;

// local vars
int cursorPosition = 0;
int offsetCursor = 0;
int currentLength = 1;
char currentPassword[ 1<<7 ];
int64 estfilesize = 0;
int64 charswritten = 0;
int lastpercentage = 0;
FILE *fp;

int64 pow64(unsigned int base, unsigned int exp)
{
int64 result = 1;
for (unsigned int v=0; v < exp; v++)
 result *= base;

return result;
}


void Processbar()
{
int percentage = (charswritten * 100) / estfilesize;
if (percentage > 100) percentage = 100;
char bar[51] = ""; ZeroMemory(bar, sizeof(bar));
if (percentage > lastpercentage)
{
 lastpercentage = percentage;
 int bars = percentage / 2;
 for (int z=0; z <= bars; z++)
	 bar[z] = '|';

 printf("\r	 [ %-50.50s ] [ %d%% ]", bar, percentage);
}
}
void WritePassword(char* password)
{
fprintf(fp, "%s\n", currentPassword);
charswritten += strlen(password) + 2;
Processbar();
}

BOOL GeneratePosition(int position)
{
for (unsigned int x=0; x < strlen(charset); x++)
{
currentPassword[position] = charset[x];
if (position > 0) GeneratePosition(position-1);
if (((position > 0) && (currentPassword[position] != charset[0])) || (position == 0)) WritePassword(currentPassword);
}
if (cursorPosition == maxPWLength-1) return FALSE;

return TRUE;
}

int main(int argc, char* argv[])
{
// -> main routine

// parse configuration file
char path[ 1<<9 ]; GetCurrentDirectory( sizeof(path)-1, path);
char absconfigfile[ 1<<10 ]; sprintf(absconfigfile, "%s\\%s", path, configfile);
GetPrivateProfileString("PWListGen", "outputfile", "passwords.txt", outputfile, sizeof(outputfile)-1, absconfigfile);
GetPrivateProfileString("PWListGen", "charset", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", charset, sizeof(charset)-1, absconfigfile);
maxPWLength = GetPrivateProfileInt("PWListGen", "maxPWLength", 4, absconfigfile);
cursorPosition = GetPrivateProfileInt("PWListGen", "minPWLength", 1, absconfigfile)-1;

if (maxPWLength < cursorPosition+1) maxPWLength = cursorPosition+1;

for (int x=0; x<=cursorPosition; x++)
currentPassword[x] = charset[0]; // set startpassword

// calculate estimated filesize
/*double estfilesize = 0;
for (int x=1; x <= maxPWLength; x++)
estfilesize += (pow( strlen(charset), x) * (x+2));*/ // inaccurate

for (int x=1; x <= maxPWLength; x++)
 estfilesize += pow64(strlen(charset), x) * (x+2); // combinations * length of combination and \r\n

char estfilesizestr[ 1<<7 ] = "";
if (estfilesize < 1024LL)
sprintf(estfilesizestr, "%.2f Bytes", (double)estfilesize);
else if (estfilesize < pow64(1024,2)) {
sprintf(estfilesizestr, "%.2f kBytes", (double)estfilesize / 1024LL); }
else if (estfilesize < pow64(1024,3))
sprintf(estfilesizestr, "%.2f MBytes", (double)estfilesize / pow64(1024,2));
else if (estfilesize < pow64(1024,4))
sprintf(estfilesizestr, "%.2f GBytes", (double)estfilesize / pow64(1024,3));
else if (estfilesize < pow64(1024,5))
sprintf(estfilesizestr, "%.2f TBytes", (double)estfilesize / pow64(1024,4));
else sprintf(estfilesizestr, "too big");

// open filehandle
if (fp = fopen(outputfile, "w"))
{
printf(" + Config:\n\n");
printf(" - output file = %.48s\n", outputfile);
printf(" - charset = [%.256s]\n", charset);
printf(" - min. password length = %d\n", cursorPosition+1);
printf(" - max. password length = %d\n", maxPWLength);
printf(" \n");


printf(" + Estimated file size: %.48s\n\n", estfilesizestr);

printf(" + Opened %.48s successfully... Attempting to write now...\n\n", outputfile);

// doing that generating process
while (GeneratePosition(cursorPosition))
cursorPosition++;

// close filehandle
fclose(fp);
printf("\n\n + Done. \n\n");

getchar();

}


return 0;
}

 

Van processbar, előre kiszámolja a 'passwords.txt' állomány várható méretét.

A program a futás során egy külső 'settings.ini' állományból tölti be a szükséges configot.

Példa a 'settings.ini'-re:

[PWListGen]
outputfile=passwords.txt
charset=abcdefghijklmnopqrstuvwxyz0123456789
maxPWLength=8
minPWLength=8

 

A problémámról meg már bőven írtam...

Share this post


Link to post
Share on other sites

Sajnos nem tudom értelmezni a forráskódot, de mit csinál ez a cucc, ha a probléma még mindig fent áll? Tehát mi nem jó ebben a progiban.

Egyébként megírtam a programot sorba menve is, de még a felénél sem jár és a txt már 1 gigás, nem tudom mi a fenéhez kellhet neked cirka 1,2 billió darab 8 karakteres jelszó, elárulhatnád :)

Share this post


Link to post
Share on other sites

Sajnos nem tudom értelmezni a forráskódot, de mit csinál ez a cucc, ha a probléma még mindig fent áll? Tehát mi nem jó ebben a progiban.

Egyébként megírtam a programot sorba menve is, de még a felénél sem jár és a txt már 1 gigás, nem tudom mi a fenéhez kellhet neked cirka 1,2 billió darab 8 karakteres jelszó, elárulhatnád :)

 

A probléma: egy jelszón belül egy karakter csak egyszer szerepeljen.

A fenti program minden lehetséges variációt elkészít,hihetetlen gyorsan...

...csak éppen a végeredmény több, mint 26TByte (az 1,2 billió darab jelszóval számolva)

De ha minden egyes jelszóban csak egyszer szerepel minden egyes karakter,

az eredmény jóval kisebb és kezelhetőbb lesz. (feltételezéseim szerint)

Lefordított forrás mellékelve.pwlistgen.zip

Share this post


Link to post
Share on other sites

Az 1,2 billió az már úgy jön ki, hogy minden karakter csak 1x szerepel. Első helyre választhatsz 36-ból, másodikra 35ből...8.-ra 29-ből, így ez összesen 36!/28!, ami pontosan 1220096908800 darab jelszó lesz, egyenként 8 karakterrel.

Most ha azt vesszük, hogy egy karaktert 1 byte-on tárolunk, akkor az jelszavanként 8 byte, plusz hogy a kövi új sorba kerüljön, ahhoz kell egy újsor karakter, ami 2 byte-on van ábrázolva, tehát szép kerek 10 byte kell egy jelszónak. azt hiszem ez nem nehéz összeszorozni a jelszavak darabszámával. Így máris megkaptad hogy hány bájtos lesz a txt, nálam terabyte-ban ez 12,2 TB, tebibyte-ban pedig 11,1 TiB.

Mellesleg ha minden karakter szerepelhet minden helyen, akkor az egyszerűen 36^8-on, ami 2821109907456 darab jelszót jelent, ha a kettő arányát nézzük, akkor cirka 2,3x több akkor, ha lehet ismétlődés. Ez akkor a méretben is ugyan ennyi, tehát 12,2 TB * 2,312, ami 28,2 TB, és ez 25.66 TiB, tehát ez egész jól megközelíti a te számításaidat.

Nos ezek után kérdem én, biztos hogy van neked ehhez a művelethez elég kapacitásod? :P

 

Egyébként azt honnan tudod hogy villámgyorsan legenerálja az összes jelszót? Hogy próbáltad ki?

Share this post


Link to post
Share on other sites

Nem egy jelszógenerátort próbáltam, s ez a leggyorsabb

Próbáld ki pl. 6 karakterrel (16.62 GByte) ezt, és egy másikat....

Share this post


Link to post
Share on other sites

Sajnos út közben rájöttem, hogy az én progim nem pont azt csinálja amit én szerettem volna, viszont a tiéd sem, egy 4 hosszú jelszógenerálásnál az utolsó pár jelszó: 5999

6999

7999

8999

9999

9999

9999

9999

 

És a lista közben is van több helyen, ahol nemhogy a karakterek (mert azt tudjuk, hogy a progi nem bírja, hiszen ezért írtál ide), de még a jelszavak is egyeznek többször.

Less utána, hogy hol lehet a bibi, én is próbálom helyrepofozni az enyémet. Egyébként tényleg gyors a cucc :)

 

Szerk: ja és azt hiszem amit az előbb írtam, faktoriálisokat meg hatványokat, azok marhaságok voltak...annál kicsit bonyolultabb a végeredmény kiszámításának módja. Megpróbálom újra átgondolni. Megírtam közbe a progit úgy mint ahogy a tiéd van, hogy egy jelszóban lehet több azonos karakter is, nekem szám szerint 4 hosszúságú karaktereknél 1.727.604 darab lett.

 

Szerk2: átgondoltam, kipróbáltam, mégsem volt marhaság. Teljesen jól kijön a számbeli eredmény a jelszavak darabszáma és az előre kiszámolt lehetséges darabszámok között. Viszont nekem csak pythonban sikerült megoldani, ott is függvény segítségével, nem elemi úton, úgyhogy nem sok újat tudok mondani annak terén, hogy milyen algoritmussal lehet minden lehetséges jelszót létrehozni úgy, hogy ne legyen se karakter se jelszóismétlés.

Share this post


Link to post
Share on other sites

Köszönöm a segítséget.

Akkor Rainbow tábla lesz....

Share this post


Link to post
Share on other sites

A rainbow table kicsit más tészta, de ha eredetileg is jelszótörésre kellett volna a cucc, akkor miért nem realtime hasonlítod össze minden egyes aktuális jelszóval a keresendő jelszót, úgy nem kéne eltárolnod a 11 TB adatot. A rainbow table önmagában nem segít szerintem, de nem értek ehhez különösebben.

Share this post


Link to post
Share on other sites
:)
  • Upvote 1

Share this post


Link to post
Share on other sites

windows.h szagot érzek

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Bejelentkezés

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×