Autor Beitrag
walter_b
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: Sa 12.07.08 18:34 
Einfach für Berechnungen in "normale" Zahlen konvertieren und zur Ausgabe wieder zurück.
walter_b Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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(Suche in der Entwickler-Ecke INT64,Suche in der Entwickler-Ecke 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Sa 12.07.08 19:07 
Auf dsdt findet man das hier:
ausblenden 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; // Damit auch Nachfolgende Routinen abgebrochen werden
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: Sa 12.07.08 19:46 
Und wo ist da ein anderes Zahlensystem von Nöten? :?!?:
walter_b Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: So 13.07.08 00:17 
edit Vergesst diesen Post :p
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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.

ausblenden volle Höhe Delphi-Quelltext
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;  //maximal 12 Zeichen

procedure GeneriereKombinationen(const aRekursion: TPWLaenge;
                               const aPasswort: String): Boolean;
var
  i: Char;
begin
  i := #0;  //#0 markiert ein Stringende, bracuht imho nciht durchlaufen werden
  if aRekursion <> 0 then begin
    repeat
      Inc(i);
      result := GeneriereKombinationen(Pred(aRekursion), aPasswort + i);
    until i = #255;
  end else begin  //letzte Rekursionsstufe, nun ausprobieren.
    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  //iterative Tiefensuche probiert nach und nach längere Passwörter
    if GeneriereKombinationen(i, '') then
      break;  //Fertig, PW geknackt.
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: 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!

ausblenden volle Höhe Delphi-Quelltext
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;     // Wird benötigt um das nächste Zeichen im String zu erhöhen wenn das vorherige an der Grenze ankommt.
  Str      : String;      // Zeichenkette die "bearbeitet" wird
  StPos    : Integer;     // Zähler für Rekursion
  pwLength : Integer;     // Länge des Passwortes
  Spectrum : Integer;     // Anzahl möglicher Zeichen
  CombList : TStringList; // Hier werden alle Kombinationen gelistet
...
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) // erhöht den Asciiwert um 1 wenn inerhalb der Grenze 
 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: So 13.07.08 09:37 
user profile iconJerk 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: 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:


ausblenden volle Höhe Delphi-Quelltext
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
  { TODO -oUser -cConsole Main : Insert code here }

  //write('Anzahl Stellen: ');readln(digits);
  //write('Anzahl Zeichen: ');readln(characters);
  //combs:=power(characters,digits);
  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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: So 13.07.08 11:39 
user profile iconwalter_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.


user profile iconHidden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 135

Windows Vista/XP
Delphi 6
BeitragVerfasst: 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:

ausblenden volle Höhe Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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 :gruebel: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: So 13.07.08 12:34 
user profile iconwalter_b hat folgendes geschrieben:

Und ja, die Geschwindigkeit, die du erreicht hast, ist zwar ganz nett, aber trotzdem noch ein bisschen zu langsam ;)


user profile iconJerk hat folgendes geschrieben:

Knappe zwei Sekundne für 16384 Kombinationen ist nicht wirklich gut



Habe grade rausgefunden das mein Code so lahm, is weil er alles in eine Listbox/Stringlist schreibt. Gibt es ne schnellere Methode?


Zuletzt bearbeitet von Jerk am So 13.07.08 12:48, insgesamt 2-mal bearbeitet