ohgr Posted Február 11, 2013 Share Posted Február 11, 2013 Ü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) Idézés Link to comment Share on other sites More sharing options...
tiger105 Posted Február 11, 2013 Share Posted Február 11, 2013 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. Idézés Link to comment Share on other sites More sharing options...
ohgr Posted Február 11, 2013 Author Share Posted Február 11, 2013 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. Idézés Link to comment Share on other sites More sharing options...
tiger105 Posted Február 11, 2013 Share Posted Február 11, 2013 É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 Idézés Link to comment Share on other sites More sharing options...
ohgr Posted Február 11, 2013 Author Share Posted Február 11, 2013 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... Idézés Link to comment Share on other sites More sharing options...
tiger105 Posted Február 11, 2013 Share Posted Február 11, 2013 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. Idézés Link to comment Share on other sites More sharing options...
ohgr Posted Február 12, 2013 Author Share Posted Február 12, 2013 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... Idézés Link to comment Share on other sites More sharing options...
tiger105 Posted Február 12, 2013 Share Posted Február 12, 2013 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 Idézés Link to comment Share on other sites More sharing options...
ohgr Posted Február 12, 2013 Author Share Posted Február 12, 2013 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 Idézés Link to comment Share on other sites More sharing options...
tiger105 Posted Február 12, 2013 Share Posted Február 12, 2013 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? Egyébként azt honnan tudod hogy villámgyorsan legenerálja az összes jelszót? Hogy próbáltad ki? Idézés Link to comment Share on other sites More sharing options...
ohgr Posted Február 12, 2013 Author Share Posted Február 12, 2013 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.... Idézés Link to comment Share on other sites More sharing options...
tiger105 Posted Február 12, 2013 Share Posted Február 12, 2013 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. Idézés Link to comment Share on other sites More sharing options...
ohgr Posted Február 12, 2013 Author Share Posted Február 12, 2013 Köszönöm a segítséget. Akkor Rainbow tábla lesz.... Idézés Link to comment Share on other sites More sharing options...
tiger105 Posted Február 12, 2013 Share Posted Február 12, 2013 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. Idézés Link to comment Share on other sites More sharing options...
ohgr Posted Február 12, 2013 Author Share Posted Február 12, 2013 1 Idézés Link to comment Share on other sites More sharing options...
hajani Posted Február 22, 2013 Share Posted Február 22, 2013 windows.h szagot érzek Idézés Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.