| Autor |
Beitrag |
walter_b
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 12.07.08 18:22
Hallo zusammen.
Ist es möglich, mit einem 36er-Zahlensystem zu rechnen? Also dass es nach 9 einfach mit a, b, c etc. weitergeht? Z.b.
Quelltext 1:
| a56b8e7uzx + 1 = a56b8e7uzy |
Dass es mit Hexidezimal möglich ist, habe ich bereits herausgefunden, doch wie siehts mit dem aus? Falls ja, wie müsste ich das anstellen?
Vielen Dank für eure Hilfe.
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Sa 12.07.08 18:34
Einfach für Berechnungen in "normale" Zahlen konvertieren und zur Ausgabe wieder zurück.
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 12.07.08 18:38
Das ganze wird dann aber ziemlich langsam, wenn immer jede Stelle einzel berechnet werden muss, nicht? Das Ziel ist eben, dass dies schnell vonstatten geht, seeehr schnell 
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Sa 12.07.08 18:45
Ich weiß ja nicht genau, was du vorhast, aber vermutlich sollen die Zahlen im 36er-System ein- und ausgegeben werden und zwischendurch diverse Berechnungen durchlaufen. Was ich vorher sagen wollte, ist, dass du einfach zwei Funktionen zur Konvertierung von 36er-System-Strings in Integers und zurück schreibst und deine Zahlen intern dann eben als Integers speicherst und verrechnest. Die Umrechnung wird auch nicht so aufwendig, dass das langsam wäre.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 12.07.08 19:06
Inter wird ja im Binärsystem gerechnet; Zahlen werden vom 10er ins 2er-System konvertiert. Warum sollte man denn nun den Gegenteiligen weg gehen und die Basis vergrößern? Das Binärsystem scheint ja Vorteile zu haben..
Und wenn, warum dann ausgerechnet 0..9 + a..z; das läge ja nur an unseren Zeichen. Eine noch größere Basis würde einen möglichen Vorteil ja potenzieren!
Meine Glaskugel(ja, die benutze ich jetz auch mal  ) sagt mir, dass du entweder größere Zahlen als mit Integer darstellen willst( INT64, BININT) oder Eingaben in hexadezimaler Notation zulassen willst. Dazu gigbt es bestimmt analog zu IntToStr und StrToINt ähnliche Funktionen mit HexToStr und StrToHex..
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Zuletzt bearbeitet von Hidden am Sa 12.07.08 19:08, insgesamt 4-mal bearbeitet
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: Sa 12.07.08 19:07
Auf dsdt findet man das hier:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function DezToX(dez, bas: Cardinal): String; const zahlen: array[0..15] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'); begin If (Bas>16) OR (bas<2) Then Begin MessageDlg('Unzulässige Zahlenbasis:'+IntToStr(bas),mtWarning,[mbOK],0); Abort; End; if dez <> 0 then Result := DezToX(dez div bas, bas) + zahlen[dez mod bas] else Result := ''; end; |
Geht aber leider nur von Basis 2 bis 16, aber du kannsts ja umschreiben.
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 12.07.08 19:17
Vielen Dank für eure Bemühungen. Um vorerst einmal die Schummelei der Glaskugel aufzudecken: Ich habe was ganz anderes vor. Und zwar (haltet euch fest  ): ich will simulieren, wie ein Passwortknackprogramm funktioniert. Und deshalb würde ich gerne einfach die ganzen Kombinationen (Bruteforce) durchgehen. Das mit den 36 war einmal eine Grundstufe, würde a-z und 0-9 entsprechen, jedoch könnte ich das ja dann noch auf A-Z und ev. sogar Sonderzeichen aufstocken. Da ich dann auch noch die Simulationsgeschwindigkeit mit einer herkömmlichen Knackgeschwindigkeit vergleichen will, wäre es natürlich toll, wenn nicht allzu grosser Rechenaufwand dahinter steckt, damit mein Programm einigermassen mithalten kann. Oder ist es unmöglich, an die Knackgeschwindigkeit von John the Ripper oder ähnlichem (um die 4'000'000 Keys pro Sekunde) ranzukommen?
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Sa 12.07.08 19:46
Und wo ist da ein anderes Zahlensystem von Nöten? 
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 12.07.08 20:03
Da ich ja von der einen Kombination zur nächsten kommen will, wäre es noch praktisch, wenn ich einfach +1 rechnen könnte. Oder wie würdest du das machen? Einfach mal ein paar Milliarden Kombinationen in einen Array speichern?
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: Sa 12.07.08 20:13
Dazu sind absolut keine Buchstaben vonnöten. Behandle die Buchstaben als Zahlen und prüfe von 0 bis 255, dann hast du das gesamte ANSI-System abgedeckt (bei Unicode ist es entsprechend dann 65536).
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 12.07.08 21:39
War kurz afk...
hm... Etwas in diese Richtung habe ich mir auch schon überlegt. Würdest du dann jede Stelle einzeln behandeln? Oder ist es möglich, alles in eines zu packen?
|
|
Jerk
      
Beiträge: 251
Vista Ultimate, Ubuntu
Turbo Delphi 2006
|
Verfasst: So 13.07.08 00:17
edit Vergesst diesen Post :p
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 13.07.08 00:39
Hi,
Edit: Okay, vergessen^^ /Edit
Ich würd das rekuriv machen: Die Prozedur löst sich in einer repeat-Schleife(schneller als for) für jeden Char(i := #0-> #255) einmal selbst aus(Rekursion) und hängt immer idesen Char an. So werden alle Möglichkeiten durchlaufen.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| type TPWLaenge = 0..12; procedure GeneriereKombinationen(const aRekursion: TPWLaenge; const aPasswort: String): Boolean; var i: Char; begin i := #0; if aRekursion <> 0 then begin repeat Inc(i); result := GeneriereKombinationen(Pred(aRekursion), aPasswort + i); until i = #255; end else begin repeat Inc(i); result := ProbiereAus(aPasswort + i); until i = #255; end; end;
procedure KnackePasswort(); var i: Integer; begin for i := 0 to 12 do begin if GeneriereKombinationen(i, '') then break; end; end; |
So, eine Sache noch: Wahrscheinlich lohnt es sich, zuerst einen eingeschränkten Zeichensatz zu durchlaufen, da die meißten PWs nur ein bestimmtes Set verwenden..
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Jerk
      
Beiträge: 251
Vista Ultimate, Ubuntu
Turbo Delphi 2006
|
Verfasst: So 13.07.08 01:12
Ist nich die Anzahl an Kombinationen gleich der Anzahl möglicher Zeichen hoch Länge des Passwordes?
Also wenn man nur im bereich 1 bis 128 bleibt, hat man 128^2 also 16384 Kombinationen ?
Hab mal was zusammen gebastelt was glaube ich alle kombinationen ermittelt:
Konnte bei Google spontan nix finden, falls es irgentwie schneller geht, und das glaube ich, würde ich gerne wissen wie.
Knappe zwei Sekundne für 16384 Kombinationen ist nicht wirklich gut!
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| var Jump : Integer; Str : String; StPos : Integer; pwLength : Integer; Spectrum : Integer; CombList : TStringList; ... procedure TBruteForcer.GenerateCombinations; var i : integer; begin StPos := 0; Str := ''; for i := 1 to pwLength do Str:=Str + chr(1); CombList.Add(Str); Step; end; procedure TBruteForcer.Step; begin inc(Stpos,1); jump := 0; Compare; CombList.Add(Str); if StPos < power(Spectrum,pwLength)-1 then Step; end; procedure TBruteForcer.Compare; begin if ord(Str[pwLength-jump]) < Spectrum then Str[pwLength-jump]:=chr(ord(Str[pwLength-jump])+1) else if jump < pwLength then begin Str[pwLength-jump]:=chr(1); inc(jump,1); Str[pwLength-jump]:=chr(ord(Str[pwLength-jump])+1); Compare; end; end; | ;
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: So 13.07.08 09:37
Jerk hat folgendes geschrieben: | Ist nich die Anzahl an Kombinationen gleich der Anzahl möglicher Zeichen hoch Länge des Passwordes?
Also wenn man nur im bereich 1 bis 128 bleibt, hat man 128^2 also 16384 Kombinationen ?
[...]
Knappe zwei Sekundne für 16384 Kombinationen ist nicht wirklich gut! |
Das mit der Anzahl möglicher Kombinationen stimmt. Aber irgendwie wäre es vielleicht noch praktisch, wenn er nicht einfach alle Möglichkeiten durchgeht, sondern man allenfalls während des Rechnungsprozesses auch noch rausfinden könnte, wo er gerade steht.
Und ja, die Geschwindigkeit, die du erreicht hast, ist zwar ganz nett, aber trotzdem noch ein bisschen zu langsam
Aber ich frage mich sowieso, wie John the Ripper die 4 Mios hinbringt. Schliesslich geht er jede Möglichkeit durch, während dem laufenden Prozess kann man durch drücken einer beliebigen Taste die aktuelle Position sowie die Geschwindigkeit innerhalb von weniger als 0.5 Sekunden abrufen. Damit er nur schon die Geschwindigkeit weiss, mit welcher er unterwegs ist, die Systemzeit und alles auch immernoch aufzeichnet und sogar ein Logbuch führt braucht er wohl einiges an Rechenleistung nur schon für die "Umgebung". Ist das überhaupt möglich, eine annährend gleich schnelle Simulation zu erstellen?
Ich werde jetzt mal noch die Lösung von Hidden genauer anschauen, da mir auf den ersten Blick nicht gerade klar wurde, wie das ganze funktioniert.
Aber auf jeden Fall schon mal vielen Dank für eure Codesamples und eure Bemühungen.
Edith meint noch: Jungs, ihr seid viel zu grosszügig mit den Zeichen. Wird bei JTR "all" ausgewählt, so kommen 95 verschiedene Zeichen dran. Und wenn ihr euch das mal für ein normales Passwort überlegt: a-z, A-Z, 0-9. Damit hat man erst 62 Zeichen. Von daher würde ich eher auf eine Länge von 95 als auf 255 setzen, aber dies ist ja nur ein kleines Detail. Vielleicht hilfts ja. Habe gerade auch noch eine Idee, werde dies nachher gleich noch ausprobieren.
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: So 13.07.08 11:26
Ich habe jetzt bei mir auchmal was ausprobiert. Lasse ich einfach nur die Zahlen durchzählen, macht meiner ungefähr 100'000'000 pro Sekunde. Jedoch ist ja nicht das Ziel, einfach durchzuzählen. Deshalb habe ich folgenden Programmteil versucht:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| var combs : Comp; digits : integer; characters : integer; position : int64; rest : integer; count : integer; limit : integer; DateTime1 : TDateTime; DateTime2 : TDateTime; Ziit : Comp;
begin
write('Anzahl Kombinationen: ');readln(combs); DateTime1 := Time; position:=0; count:=0; limit:=(characters+1)*100; rest:=100-characters; repeat repeat repeat inc(count); inc(position); until count = characters; inc(position,rest); count:=0; until position = limit; inc(position,((rest-1)*100)); until position = combs; writeln(combs); DateTime2 := Time; ziit := DateTime2-DateTime1; writeln(ziit); readln; end. |
Die Idee dahinter ist relativ simpel: Ich nehme an, dass jeweils zwei Stellen in der Zahl einer Stelle im Passwort entspricht. Da das Passwort jedoch nur 95 Zeichen und nicht 100, wie die Zahl, hat, muss natürlich ein bisschen rumgebastelt werden. Diese Programm ist noch nicht fertig, doch schon bei 20'000 Kombinationen braucht es enorm lange. Ich weiss zwar nicht, was ich falsch mache, oder ob es wirklich so schlecht programmiert ist.
Vielleicht kann ja einer von euch mit der Idee was anfangen oder bringt einen besseren Vorschlag.
Vielen Dank im Voraus.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 13.07.08 11:39
walter_b hat folgendes geschrieben: | | Edith meint noch: Jungs, ihr seid viel zu grosszügig mit den Zeichen. Wird bei JTR "all" ausgewählt, so kommen 95 verschiedene Zeichen dran. Und wenn ihr euch das mal für ein normales Passwort überlegt: a-z, A-Z, 0-9. Damit hat man erst 62 Zeichen. Von daher würde ich eher auf eine Länge von 95 als auf 255 setzen, aber dies ist ja nur ein kleines Detail. Vielleicht hilfts ja. Habe gerade auch noch eine Idee, werde dies nachher gleich noch ausprobieren. |
Hidden hat folgendes geschrieben: | | So, eine Sache noch: Wahrscheinlich lohnt es sich, zuerst einen eingeschränkten Zeichensatz zu durchlaufen, da die meißten PWs nur ein bestimmtes Set verwenden.. | 
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: So 13.07.08 11:47
Meine Aussage war nicht für dich bestimmt, aber tut mir leid, dass ich dich wiederholt habe
Ich komme irgendwie nicht weiter.  Habe hier mal noch einen Code aus der Konfigurationsdatei von JTR:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| int length; // Current length
void init() { word[0] = 'A' - 1; // Start with "A" word[length = 1] = 0; }
void generate() { int i;
i = length - 1; // Start from the last character while (++word[i] > 'Z') // Try to increase it if (i) // Overflow here, any more positions? word[i--] = 'A'; // Yes, move to the left, and repeat else // No if (length < 7) { word[i = ++length] = 0; // Switch to the next length while (i--) word[i] = 'A'; return; } else { word = 0; return; // We're done } }
void restore() { length = 0; // Calculate the length while (word[length]) length++; } |
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 13.07.08 12:09
Hi,
Die Idee im letzten Post finde ich genial^^ im Prinzip wird ein Array wie eine Zahlenvariable behandelt. Durch Überlauf verhält es sich auch so.
Mir wurde aber meine ich mal gesagt, dass ein Überlauf verhindert wird, indem die Zahl im Prozessor in sich selbst überläuft oder so  vielleicht kann da besser jemand, der sich auskennt was sagen. Außerdem wäre imho noch garnicht gesagt, dass die Arrayelemente im Speicher auch hintereinander liegen(habe es aber auch nur überflogen, bin mir gerade unsicher, ob ich das richtig verstanden habe^^).
Imho müsste man aber garnicht ständig auf Überlauf checken, wenn man mit Pointern arbeitet:
Man nehme eine Cardinal-Variable, lasse sie hochlaufen und arbeite mit Pointern auf ihre einzelnen Bytes, die man in PChar castet.. Nur so ne Idee, hab ich auch noch nicht mit gearbeitet. Vorteil wäre, dass eine normal optimierte Zählvariable dabei läuft. Die könnte man dann noch so gestalten, dass nur die besagten Chars durchlaufen werden('a'..'z', 'A'..'Z', '0'..'9').
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Jerk
      
Beiträge: 251
Vista Ultimate, Ubuntu
Turbo Delphi 2006
|
Verfasst: So 13.07.08 12:34
Zuletzt bearbeitet von Jerk am So 13.07.08 12:48, insgesamt 2-mal bearbeitet
|
|
|