From 1d7e61a2d68e9a10cc0a60be85254a92147a160e Mon Sep 17 00:00:00 2001 From: MrGeorgen Date: Mon, 23 Nov 2020 22:30:17 +0100 Subject: [PATCH] j1 docs --- j1-Passwoerter/README.md | 57 ++++++++++++++++++++++++++++++++++++++ j1-Passwoerter/j1 | Bin 21856 -> 21904 bytes j1-Passwoerter/src/main.c | 42 +++++++++++++++------------- 3 files changed, 80 insertions(+), 19 deletions(-) create mode 100644 j1-Passwoerter/README.md diff --git a/j1-Passwoerter/README.md b/j1-Passwoerter/README.md new file mode 100644 index 0000000..b894a46 --- /dev/null +++ b/j1-Passwoerter/README.md @@ -0,0 +1,57 @@ +# Allgemeine Informationen + +Die Grundidee für meinen Passwortgenerator ist das Passwort aus richtigen Wörtern zu bilden. +Als erstes Argument muss man einen Dateipfad zu der Textdatei mit einer Liste von Wörtern, die von einem Zeilenumbruch getrennt sind, verwenden. +Unter wörter.txt ist ein Beispiel dafür ([Quelle](https://www.netzmafia.de/software/wordlists/deutsch.txt)). +Das Passwort wird zu stdout ausgegeben. + +# Regeln für das generierte Passwort + +1. Zufällige Wörter werden aus der Wörterliste ausgewählt. +2. Am Anfang des Passworts und zwischen den Wörtern steht eine Ziffer. +3. Am Ende steht ein Satzzeichen. + +# Funktionsweise + +Als erstes wird die angebene Textdatei mit der Wörterliste ausgelesen. +Alle Zeilenumbrüche werden durch \0 ersetzt und Pointer zu jedem Wort in einem Array gespeichert. +``` +for(char *i = woerterText; (uintptr_t)i < dest; ++i) { + if(*i == '\n') { + char *nextWord = i + 1; + woerter = acl_arraylist_append(woerter, &nextWord); + pointerCheck(woerter); + *i = '\0'; + } +} +``` +Danach werden Bytes mit zufälligen Werten von `/dev/random` ausgelesen.
+` fread(randomInt, sizeof *randomInt, randomInt_len, randomFile);`
+Dafür habe ich mich entschieden, da dieser ein krypografisch sicherer Zufallszahlengenerator ist. +Passwörter, die mit Pseudozufallszahlengeneratoren generiert werden, sind einfach zu knacken, da bei diesen jede Zufallszahl von der vorherigen abhängt. +Oft wird als Startwert auch noch die aktuelle Zeit benutzt, was das Ganze noch unsicherer macht. +Auf Basis der Zufahlszahlen wird dann das Passwort aus Wörtern und Ziffern zusammengesetzt. +``` +for(uint32_t i = wordsForPass_len; i < randomInt_len; ++i, ++j) { + char buf[2]; + buf[1] = '\0'; + sprintf(buf, "%" PRIu32, randomInt[i] % 10); + strcat(password, buf); + strcat(password, wordsForPass[j]); +} +``` +Zum Schluss wird noch ein zufälliges Satzzeichen angehängt. +``` +const char specialCharacter[] = {'?', '.', ',', '!', ';'}; +char randomSpecialCharacter[] = {specialCharacter[randomInt[randomInt_len - 1] +% (sizeof specialCharacter - 1)], '\0'}; +``` +Dann wird das Passwort wird schließlich ausgegeben. + +# Beispiel + +Beipielausgabe: `0zaehneknirschend8verraeterischem6veranstaltet,`
+Die Textdatei in diesem Fall wörter.txt wurde ausgelesen, \\n durch \0 ersetzt um das Ende vom String zu markieren. +Danach wurden Pointer zu jedem Wort der Textdatei erstellt. +Anschließend wurden die Wörter zaehneknischend, verraeterischem, veranstaltet, die Ziffern 0, 8, 6 ausgewählt und zusammengesetzt. +Ein Komma wurde angehängt und das Passwort schließlich ausgegeben. diff --git a/j1-Passwoerter/j1 b/j1-Passwoerter/j1 index 7182997352f1f90f8312ac239e1e4d8853ee5e42..b848cfaafe0cabf7a9f2c34872175ede6810a2e3 100755 GIT binary patch delta 2192 zcmZ8ieN0nV6u-A0wht}vilx-4ZBb+duq_OcIH08<#Wy$)xrvBqLO-zhmnXGPsKg`NB4q~=wvgzhm%Cc&ia|+P}=Jf8|_imSso4oV8=XcJz z_uP+jU;H@TdxGxGkwY?3npXwV)LU>=ic6{%@BPIkoi(e?V1GU&t zqxelz*svmPK(+bwG5EAr@M_)Aug#%9a*ckY$RmpUK(Sv!+oy^?s>nWtb?e-;U(qip z@`NJyDYh8ezK1d0YI+TV`u)1j?yfCxTYti!AzGYX0|%xRuB4b0Pb(8Y2Y!*>{g@%z zIf;#8zZH?&dHY1M>&bMqb8cowhlvm!$rgI|tPb1~4RL_eVD+?%9f`l71QVkQ#3A@t z)BpJxbQlV4(}fp@WTUF^ZA*t!1}oe!%rH&-hqb{?!&RCFUm0E01PS9s(`hlP0b{Ju zKB;ipmzl3pd090f>$8v>J^hq1mbV?&%B6LSst9?QVXq}5&{HX+OQ1)e#-U=O%M#eF zPe*%TXRJ$N@eF$iqscje=s&`ZJ!RM6x;(o!QK@oRyR#;+o)19!<+(7;CwRtXG0za9(^g3i`-8H7q=Cf6% zMWvYwD7_DEOIuoCcU>qD`7XKVFW6;qOK(1AjH_?MMN6~h>15QAeMg#=_kgi=87{pA zPi%`}JdjZoyE}J0Bh#ddIvw*hdD{vJ@x9a#x#DYWh&=MO_#%I|26~D+k#1gI@FcL~ z4`Xsi^v&E|rjOlac&(w_J!hMHgfR!6x)*T>*Od1wV~bG_BDNt8CKwALUO_yB_y{qE z*m|3>IN|^zUKFzA4vvF(8PSV)EXi0q;>J;oM=blDu_K6~`;47OyoZZPYKWN}9AnIg zH#Kvdv1buGA>l5hogjNkX%p0W=GlyK^uW|o4fl_{f?oo{9y=X_!=8Lv0mIl|2%{*A zK`OD+O;CWc4;oNrK?lkRL{R$R7|P#ZxMUtO_ppBkOr`Va6Y!MU=^hB8jKk*Adi}(o zjL~Rc?lWmpssbD^Qdx}w&Z^Zk1mP+>ErP>U)fg~RWtUTh!EY>YUXZJ~Em&=*C!?FO zFRv5NkLo~33GZPb;1ZQ2ov=~pyL9C=7f_3@yWmr>Z^}K~1naB-^`V@hrTSR7OtBhS3 zK2)L(3hQW&N}m%}j%H0dIU}+ZG&#ki=%6Cs1?N&Ly~+EwF);dA_!NBK9>A+or^BfDw#+Px#z$s>V&i=Og50jg_R{Izf{IO6+m))muFS zB32e_{8>2tAo!+Sl~^VCTRavH)f)>gP093m5s~^^VF@d3T$xSJ_ro)b7Y&}{)N@#X zJYQw6c%3^@=dDoL#VRgsFAATSIHXOutGumMeBR*_VgVh@UpjNnXXwjUK6Res$UDHN z$?}{RqrEO>EK&y}mjz!e_VNqCC!)@Vb}I8fnb%vtyrIUwx@2L=!m?;+*)1)!uZUy$ z`x;$xNUsK@un5A)o>c$6B!$nxV53Wl3pNgujpdS8l%N+Xn#%vJ%T#^FA>6bL9~T;Q zL1!=%yg|2=+UXE%4VFu(+ju5A5Hx78)CQYfQtCSO!(?;0l-iCVsA#FiGThoyEhW8b d!ksYKQl8ee*ndb_yYg{ delta 2083 zcmZ8ieQZ-z6u-A!KOQpHb}Mfku$IB->cIAG;^2>NEnBxv6k4~LVIUM0Tti5<@DU{> ztRa{TL^n=MFq*)UMFNJ<(wGoqVkczT!i*#eLKNAElg^1y1Vcb_J@>s^5_gk#e)s(D zIp?1HaqjE?f=-;K{iW7!D^XiO1L7L+oRpH1rX>fid!;irO*sQr`i_*Ff#8~A*l*~C0^?~T(GfjTUmB|oY6@`E=+HeO@YqTX~PMZAD%~C7#7j)BSMK^2|*6{US?YNm_9&)m45}O-S(d*1oI3j@G`1 z!S-O^za8NtD|(S`d&ToKeBe)W7Sekw-YU@j#yCxZP;Tif6M{!>J zEyh-%9z^U!OieM?i#URK0&xm4gBbdqu?fUehTzI#;OowFy*VJF|aDNGyoxGiQ~~twBUOp8g3%l zh~E`RC{8*FgNmDaU<~`^FpY8%NHtEn2|OqVp%tYb;wayPK9mZaLir<%)ht2g4)%wj zuyzT(14^xv?t>`G%g|HXV#xl*7)=jXESMuj#67maq`v_j7T0g4U681EQa23NH(+s1 z);q0Pla`?XQU%rqJ{E0o(*AT0_QlJ9XAHxEla4N}-o&~z(Bo^+4~d|Rj)|aMZ^kew z)Uqh;@N2M!@68$+ENkZL=aC^S^Qo@m3BrIq3;VHOX`s#+q8_cCdzIIt`wXTUv$(J*&!X5Nwv|CEj=36mfEP z%}@Zzsg@QPY?hU!m@m&TIV(d2d7j}xk>T57u4e8SEa9O^DE=h6`nHc4?vJ8)Ndi>fwTRk;^Z;RO!9=GikG zLvI%Zb;Zg#5vN1UwOk8Bz7hN)v5RK~|3f<18l&m-%Qy7!;ksM26MEKrt@(SOM>nL9 z?bm*TB#$+aTkn-d1v?6!NS#zAYO4z3k-BFEmoL0gNJaMJtD!`_QcV1sV-SzlK`d&4 zWYj0+Z{1LOI%?8k;pE!9QvTW`!P8zRzw}qiI3(@ diff --git a/j1-Passwoerter/src/main.c b/j1-Passwoerter/src/main.c index 8d815d7..0959611 100644 --- a/j1-Passwoerter/src/main.c +++ b/j1-Passwoerter/src/main.c @@ -1,13 +1,3 @@ -/* Die Grundidee für meinen Passwortgenrator ist richtigen Wörtern zu bilden. - * Als erstes Argument muss man den Programm einen Dateipfad zu der Textdatei mit Liste von Wörtern, die mit \n getrennt sind. - * Unter wörter.txt ist ein Beispiel dafür. Quelle: https://www.netzmafia.de/software/wordlists/deutsch.txt - * Das Passwort wird zu stdout ausgegeben. - * - * Regeln für das generierte Passwort: - * 1. zufäfflige Wörter werden aus der Wörterliste ausgewählt. - * 2. Am Anfang des Passworts und zwischen den Wörtern steht eine Ziffer. - * 3. Am Ende steht ein Satzzeichen. - */ #include #include #include @@ -19,7 +9,7 @@ #define wordCount 3 // Anzahl der Wörter des Passworts #define randomInt_len (2 * wordCount) #define wordsForPass_len randomInt_len / 2 -void pointerCheck(void *pointer) { +void pointerCheck(void *pointer) { // Funktion um auf NULL Pointer zu checken und den Fehler auszugeben. if(pointer == NULL) { perror("Error: "); exit(-1); @@ -27,33 +17,45 @@ void pointerCheck(void *pointer) { } int main(int argc, char *argv[]) { - if(argc != 2) printf("file argument required"); + if(argc != 2) { + printf("file argument required"); // checkt ob der Nutzer die richtige Anzahl von Argumenten verwendet hat. + exit(-1); + } bool sucess; - FILE *fp = fopen(argv[1], "rb"); // im binären Modus zu lesen ist deutlich schneller als im Textmodus, da man dort jede Zeile einzeln lesen muss. So wurde aus mehreren Sekunden Wartezeit keine bemerkbare Verzögerung. + + /* im binären Modus zu lesen ist deutlich schneller als im Textmodus, da man dort jede Zeile einzeln lesen muss. + * So wurde aus mehreren Sekunden Wartezeit eine nicht bemerkbare Verzögerung. */ + FILE *fp = fopen(argv[1], "rb"); char *woerterText = acl_ReadTextFile(fp, &sucess); if(!sucess) perror("Error: "); fclose(fp); unsigned len = strlen(woerterText); uintptr_t dest = (uintptr_t)woerterText + len; - char **woerter = acl_arraylist_create(1, sizeof *woerter); + + /* erstellt ein Array für die Pointer zu den Wörtern. + * Man könnte auch erst die Zeilenumbrüche zählen, um den Arbeitsspeicher auf einmal anzufragen. + * Dies würde das Programm vermutlich etwas schneller machen. + * Jedoch ist das Programm so einfacher zu verstehen und im Vergleich zum Auslesen der Textdatei wäre die Geschwindigkeitsverbesserung sehr gering. */ + char **woerter = acl_arraylist_create(1, sizeof *woerter); pointerCheck(woerter); woerter[0] = woerterText; for(char *i = woerterText; (uintptr_t)i < dest; ++i) { if(*i == '\n') { char *nextWord = i + 1; - woerter = acl_arraylist_append(woerter, &nextWord); // Pointer werden zu Begin jedes Wortes erstellt. + woerter = acl_arraylist_append(woerter, &nextWord); // Pointer werden am Anfang jedes Wortes erstellt. pointerCheck(woerter); - *i = '\0'; // \n wird mit \0 ersetzt um das Ende des Strings markieren. + *i = '\0'; // \n wird durch \0 ersetzt um das Ende des Strings markieren. // diesen Weg habe ich gewählt um viele memory allocations zu vermeiden. } } - FILE *randomFile = fopen("/dev/random", "rb"); + FILE *randomFile = fopen("/dev/random", "rb"); // /dev/random ist ein kryptografisch sicherer Zufallszahlengenerator. uint32_t randomInt[randomInt_len]; fread(randomInt, sizeof *randomInt, randomInt_len, randomFile); size_t passLen = wordsForPass_len + 1; // weil Ziffern im Passwort gleich oft vorkommen wie Wörter. + 1 für ein Satzzeichen am Ende char *wordsForPass[wordsForPass_len]; + // Die Länge des Passwortes wird berechnet. for(uint32_t i = 0; i < wordsForPass_len; ++i) { - wordsForPass[i] = woerter[randomInt[i] % acl_arraylist_len(woerter)]; // der modulo operator wird verwendet um die Zahlfallszahl auf den gewünschten Zahlenbereich zu reduzieren. + wordsForPass[i] = woerter[randomInt[i] % acl_arraylist_len(woerter)]; // der modulo Operator wird verwendet um die Zufallszahl auf den gewünschten Zahlenbereich zu reduzieren. passLen += strlen(wordsForPass[i]); } char *password = malloc(passLen + 1); @@ -66,7 +68,9 @@ int main(int argc, char *argv[]) { strcat(password, buf); strcat(password, wordsForPass[j]); } + free(woerterText); + // ein zufälliges Sonderzeichen wird angehängt. const char specialCharacter[] = {'?', '.', ',', '!', ';'}; char randomSpecialCharacter[] = {specialCharacter[randomInt[randomInt_len - 1] % (sizeof specialCharacter - 1)], '\0'}; - printf("%s", strcat(password, randomSpecialCharacter)); + printf("%s\n", strcat(password, randomSpecialCharacter)); }