| Autor |
Beitrag |
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Di 22.07.08 20:32
Grenzgaenger hat folgendes geschrieben: | walter_b hat folgendes geschrieben: | Vielen Dank. Ich weiss, dass diese Funktion ein Problemfall ist, bin auch schon dabei, sie zu optimieren, auch wenn sie in der DEC steckt
Aber das Problem ist, dass ich gerne 4 Mio in einer Sekunde erreichen würde. Was meinst du? Ist wohl bei weitem nicht erreichtbar, oder? |
tja, das denk ich nicht, dass DEC hier das problem ist, sondern eher dein umgang mit dieser routine..
es reicht doch vollkommen, sie einmal zu instanzieren und nur dann zu initialisieren wenn sich das Pwd geändert hast... in deinen code machst du das aber ständig... und auch immer mit den gleichen parametern... dass sich das auf die performance niederschlägt, ist mehr als logisch... |
Das Problem ist, dass der erste Teil des Programmes alle Möglichkeiten durchgehen muss, und gleichzeitig müssen alle diese Möglichkeiten verschlüsselt werden (=> Ziel des Programmes) und deshalb bin ich doch fast dazu genötigt, diese Funktion ständig aufzurufen!?
PS:
| Grenzgaenger hat folgendes geschrieben: | | PS: wenn du wirklich so viel wert auf performance legst, solltest dir eine implementation in assembler überlegen |
Ich kenne mich damit nicht aus. Wie genau mache ich das und was bringt es mir?
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Di 22.07.08 20:56
Hi,
Ist es nicht möglich, die Funktion als inline zu deklarieren(  ) oder(mein Favourit) schleifenbasiert an der Stelle zu platzieren?
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)
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Di 22.07.08 21:05
Hidden hat folgendes geschrieben: | Hi,
Ist es nicht möglich, die Funktion als inline zu deklarieren( ) oder(mein Favourit) schleifenbasiert an der Stelle zu platzieren?
mfG, |
Hm... mit inline meinst du, die Funktion direkt in das Programm einzubauen? Falls du dies meinst: ich arbeite daran, aber es sind einige hundert Zeilen, die dafür benötigt werden
Oder wie meinst du schleifenbasiert? Wie genau würdest du dies umsetzen?
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mi 23.07.08 08:55
Inline ist ein Zusatz bei einigen Methoden. Bei diesen Methoden darf der Kompiler den Inhalt des Codes an die Stelle des Aufrufes packen. Also du hast eine Methode die irgendwas macht und eine Stelle an der du sie aufrufst. Bei Inline wird dann nicht mehr die Methode aufgerufen sondern der Code der Methode an die Stelle des aufrufes kopiert. Ergebniss ist ein größerer Code aber weniger Sprunganweisungen. Bei wirklich kritischen stellen ist es dann schneller. Und ich denke Hidden meint mit Schleifen in etwa das Gleiche nur per Hand gemacht.
Assembler: Also komplett auf Assebler zu setzen halte ich für keine gute Idee. Besonders als Einsteiger fehlt da auch schlicht Hintergrundwissen bzw Wissen wie die CPU aufgebaut ist. Und so etwas ist fundamental wichtig bei Assembler sonst zerschießt du dir im warsten sinne des Worten willenlos irgendwelchen Speicher deiner Anwendnung. Außerdem ist Assembler keine Garantie dafür, dass es schnell wird.
Ich denke Grenzgaenger hat in sofern schon recht, dass du dein Programm erst mal schreiben und es später optimieren solltest. Nichts destro trotz ist eine sinnvolle Struktur von Anfang an wichtig. Denn wenn du ein bisschen auf das achtest was dein Code macht, dann wird kein Einsatz von Assembler nötig sein. Aber du darfst natürlich keine Sachen X Mal machen die nur ein mal benötigt werden.
Und wenn du mich fragst, dann solltest du die Delphistrings komplett sein lassen. Die Crypthbibliothek die ich kenne die arbeitet ausschließlich nur mit festen Blöckgrößen. Das einzige was keine feste Größe hat ist der Anfangsschlüssel. Aber das ist sonst auch nur ein Speicherbereich. Dieser wird nur zum Initialisieren eines Feldes benutzt. Und dieses Feld wird dann zum ver und entschlüsseln benutzt. Das wird aber auch jedes mal mit übergeben. Selbst die Datenblöcke haben eine Feste größe. Egal ob sie komplett oder nur halb gefüllt sind. Aber so hat man immer die gleichen Vorraussetzungen und kann die Codierung extrem schnell gestaltet. Das einzige was die beim ver oder entschlüsseln machen müssen ist das schlüsseln an sich. Alles andere muss in der Vorbereitung erledigt werden.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Mi 23.07.08 13:09
Lossy eX hat folgendes geschrieben: | | Und wenn du mich fragst, dann solltest du die Delphistrings komplett sein lassen. Die Crypthbibliothek die ich kenne die arbeitet ausschließlich nur mit festen Blöckgrößen. Das einzige was keine feste Größe hat ist der Anfangsschlüssel. Aber das ist sonst auch nur ein Speicherbereich. Dieser wird nur zum Initialisieren eines Feldes benutzt. Und dieses Feld wird dann zum ver und entschlüsseln benutzt. Das wird aber auch jedes mal mit übergeben. Selbst die Datenblöcke haben eine Feste größe. Egal ob sie komplett oder nur halb gefüllt sind. Aber so hat man immer die gleichen Vorraussetzungen und kann die Codierung extrem schnell gestaltet. Das einzige was die beim ver oder entschlüsseln machen müssen ist das schlüsseln an sich. Alles andere muss in der Vorbereitung erledigt werden. |
Wenn du es nicht als String definieren würdest, was wäre dann dein Definitionsvorschlag? Array?
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mi 23.07.08 15:10
Ja ich meinte schon irgendwelche festen Strukturen. Denn diese Stringaddition (string = string + string) von Delphi ist zwar ganz schön, nett und kompfortable. Aber das ist Gift für Sachen bei denen es wirklich auf Geschwindigkeit ankommt. Zu mal die Freigabe der String aus automatisiert passiert. Und das mit einem unsichtbaren Try Finally Block. Was auch gut Zeit fressen kann. Feste Strukturen als Variablen liegen normal auf dem Stack und die zu Erstellen bzw. Freizugeben kostet im Vergleich so gut wie nichts.
Wie man das genau definieren kann hängt natürlich davon ab wie dein Algorithmuss arbeitet bzw was du alles damit anstellen willst etc etc etc. Aber kleines Beispiel.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| TKey = array [0..15] of byte; TBlock = array [0..63] of byte;
InitializeKey(KeyString: String; var Key: TKey);
Encode(const Key: TKey; var Block: TBlock); |
InitializeKey würde deinen String in einen Key verwandeln und den TKey befüllen.
Encode würde die Daten in Block mit dem Key transformieren. Dadurch, dass dein Block immer ein Vielfaches von dem Key ist, brauchst du eigentlich auch kaum viel in der Methode berücksichtigen. Sondern sie muss/sollte lediglich die Daten im Block nur mit dem Schlüssel verrechnen.
Aber das bitte nicht überbewerten. Ich weiß nicht was du mit deinem Code vor hast und die größen des Keys/Blocks müssten wohl auch angepasst werden. Nur so hättest du keine Strings sondern nur pure Daten und der Code den du auf den Block anwenden würdest wäre für alles selbst verantortlich.
Du musst beim Befüllen eines Blockes aber immer mit reinschreiben wie groß der eigentliche Inhalt ist. Bzw bei Inhalten dessen Größe variieren kann. Da du sonst beim Dekodieren nicht weißt wie groß deine Daten wirklich sind.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Do 24.07.08 12:27
Habe das ganze jetzt mal umgebaut, dass es mit einem Array of Byte funktioniert. Allerdings ist jetzt eine andere Frage bei mir aufgetaucht. Die eine Funktion lautet ja so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function DecodeText(Inputtext, Key: String): String; begin with TCipher_1DES.Create do try Mode := cmECBx; Init(Key); Result := EncodeBinary(Inputtext, TFormat_HEXL); finally Free; end; end; |
Und die wird 4 Mio mal aufgerufen, da sich "Key" jedes mal ändert. Eigentlich ist es sinnlos, "with TCipher_1DES.Create do" dann jedes mal wieder neu aufzurufen, oder meine ich das nur? Jedoch wenn ich es so umbaue, dass ich es direkt in die Prozedur, welche alle Möglichkeiten durchgeht, implementiere, sodass "with TCipher_1DES.Create do" am Anfang, danach die Prozedur und dann der restliche Teil von DecodeText steht, sodass jedes mal eigentlich nur "Init(Key) und "EncodeBinary) aufgerufen wird, meldet er mir "Undeclared identifier: Init". Wieso funktioniert das dort nicht mehr? Vorher klappte es ja auch!?
Edit: Wenn ich die ganze Deklaration vorne ranhänge (TDECCipher.Init(Key); ) schlägt er mir "This form of method call only only allowed for class methods". Was will er mir hier genau erzählen? Was mache ich falsch?
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Do 24.07.08 12:56
Hi,
So, wie du es aufrufst, wäre das keine Methode des Objekts, sondern der Klasse.
'.Create' ist eine Klassenmethode(und hat ein Objekt als Rückgabewert). TMyClass.Create.DoSomething wäre eine Methode des Objekts, das von Create zurückgegeben wird.
Umgekehrt ist .Create aber auch nur eine Klassenmethode, deshalb funktioniert z.B. MyInstance.Create nicht, sondern nur myInstance := TMyClass.Create.
Warum der obere Aufruf invalid ist, weiß ich nicht, sofern TCipher_1DES eine Methode namens Init hat.. Esseidenn, es gäbe eine klassenlose Methode namens Init, die Stattdessen aufgerufen werden würde.
Probier mal aUnit.Init(Key) .. k.A., ob das geht, hab gerad kein Delphi da. Damit würde man ja normalerweise eine Methoden-Verwechslung ausschließen(z.B. Windows.Beep statt System.Beep). Ob das nun aber mit dem With-Statement inteferriert, kann ich nicht sagen.
Eventuell einfach die Methode umbenennen. Klappt es denn, wenn du das With-Statement ausbaust und die Erzeugte Instanz in einer Variable abspeicherst?
Naja.. Bleibt halt Fehlerquelle ersten Ranges, das With-Statemant
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)
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Do 24.07.08 13:10
Hm... funktioniert irgendwie nicht... Die Funktion ist übrigens so definiert: procedure TDECCipher.Init(Key: Array of Byte; IFiller: Byte);, während TDECCipher wiederrum so definiert ist: TDECCipher = class(TDECObject)
Noch was am Rande: Delphi bringt mich echt noch zum ausrasten! Meine gekürzte Version:
Delphi-Quelltext 1: 2: 3:
| begin DoEncode(@S[0], @D[0], 8); end; |
Die lange Version:
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:
| begin if Context.BlockSize = 1 then begin DoEncode(S, D, 8); FState := csEncode; end else begin Dec(Size, 8); I := 0; while I <= Size do begin DoEncode(@S[I], @D[I], 8); Inc(I, 8); end; Dec(Size, I - 8); if Size > 0 then if Size mod Context.BlockSize = 0 then begin DoEncode(@S[I], @D[I], Size); FState := csEncode; end; end; end; |
Dabei habe ich nur die Sachen gestrichen, die aufgrund des If sowieso nicht aufgeruft werden, und da das while nur einmal durchgeführt wird, habe ich dies auch gleich entfernt. Als Resultat kommt das selbe raus, nur ist meine Version natürlich wieder einmal viel langsamer. Ich weine bald, wenn es so weitergeht.
Edit2: Mir gibts gleich was. Die Assertfunktion dient ja dem Programmabbruch, falls irgendetwas nicht true sein sollte. Ich bin ganz sicher, dass es bei mir immer true ist und habe die Funktion deshalb entfernt, natürlich wieder einmal mit dem normalen Ergebnis, dass alles langsamer wurde...
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 24.07.08 13:42
Wieso nicht
Delphi-Quelltext
??
_________________ Na denn, dann. Bis dann, denn.
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Do 24.07.08 13:59
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 24.07.08 14:08
Sollte aber das Gleiche sein. Der Compiler erzeugt aus dem '@X[0]' ein
Quelltext 1: 2: 3: 4:
| "Nimm Adresse von X" "Addiere 0" "Das ist ein Wert" "Davon die Adresse" |
Und aus "X"
Quelltext 1:
| "Nimm die Adresse von X" |
Irgendwie kürzer. Probiere es einfach.
_________________ Na denn, dann. Bis dann, denn.
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Do 24.07.08 14:26
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 24.07.08 14:28
Also ich muss zu meiner Schande gestehen, dass mir nicht aufgefallen ist, dass du eine externe Bibliothek benutzt die bereits alles beinhält. Ich bin bisher davon ausgegangen, dass du selber eine Verschlüsselung auf die Beine stellen willst! Das habe ich gerade gemerkt als ich mir mal den Code angeschaut hatte. Du solltest natürlich an einer bestehenden Bibliothek nichts verändern. Außer es ist absolut notwendig und du kennst dich damit entsprechend gut aus.
Und eigentlich geht es doch nur um die Verwendung der Klasse TDECCipher, oder? Normal sieht es so aus, dass du davon eine Instanz erstellst. Diese einem Schlüssel zuweist und anschließend deine gesammte Daten ver/entschlüsseln lässt. Normal ist das Ver/Entschlüsseln recht schnell aber das Initialisieren etwas langsamer. Allerdings so wie du das in deiner Methode machst müsste das Prinzipiel schon richtig sein. Nur solltest du da nicht dauerhaft die Instanz der Klasse wegschmeißen. Denn dann musst du für jeden kleinen Text den Schlüssen neu initialieren lassen.
Also in etwa so.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| Chipher := TDECCipher.Create; Cipher.Mode := cmECBx; Cipher.Init(Key);
Cipher.EncodeBinary(...); Cipher.EncodeBinary(...); Cipher.EncodeBinary(...); Cipher.EncodeBinary(...);
Cipher.DecodeBinary(...); Cipher.DecodeBinary(...); Cipher.DecodeBinary(...); Cipher.DecodeBinary(...);
Chipher.Free; |
Wenn sich der Schlüssel dauerhaft ändert, dann wirst du da vermutlich keine große andere Chance haben als wie du es schon gemacht hattest. Allerdings frage ich mich worin da der Sinn besteht? Denn wie gesagt. Das Initialisieren des Schlüssels dauert normal seine Zeit. Das ist einfach so. Und so wäre es auch nicht möglich das volle Potential der Verschlüsselung ausnutzen zu können.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Do 24.07.08 14:45
Dass man an der Datenbank eigentlich nichts verändern soll, erschien für mich auch logisch, allerdings konnte ich die Finger nicht davon lassen  Da die Datenbank auf den allgemeinen Fall ausgelegt ist, sollte man dort auch ein bisschen Optimieren können. Ist mir bisher auch ein wenig gelungen
Bei der Verschlüsselung, die ich verwenden will, ist es leider so, dass der Key ständig wechselt und immer der selbe Text verschlüsselt wird. Deshalb ist deines wohl in diesem Falle nicht des Rätsels Lösung (tut mir leid, dich enttäuschen zu müssen  ).
Da ich sonst keine grosse Auswahl mit dem Optimieren mehr habe, habe ich mir gedacht, dass das with-Element etwas überflüssig ist, da jedes mal, wenn ich die Funktion aufrufe, wieder das Create neu lanciert wird. Deshalb wollte ich es wie folgt machen:
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:
| procedure Gen(); var X, Y, I, Len, p: Integer; Wort: arr8; Key: arr8; begin with TCipher_1DES.Create do Len := 0; for X := 0 to 7 do wort[X] := (Ord('A')-65);
inc(wort[0],32); for X := 0 to combs do begin Y := 0; inc(wort[Y]);
while wort[Y] > Ord('z') do begin if (X = 90) or (X = 8190) or (X = 737190) or (X = 66347190) or (X = 5971247190) or (X = 537412247190) then inc(wort[Y + 1],32);
inc(wort[Y + 1]); wort[Y] := ord('!'); inc(Y); Len := max(Y, Len); end; anf:=parityshift(Wort); try Mode := cmECBx; TDECCipher.Init(anf); Result := EncodeBinary('KGS!@#$%', TFormat_HEXL); finally Free; end; end; end; |
Hier würde nur einmal das with-Element aufgerufen werden (auch wenn ich keine Ahnung habe, wofür dies überhaupt gut ist), und anschliessend würde nur noch der Key ( per Initfunktion) verändert und verschlüsselt werden. Allerdings meldet er, wie bereits angesprochen, immer folgendes:
| Delphi hat folgendes geschrieben: | | "This form of method call only only allowed for class methods" |
Worauf will er mich aufmerksam machen? Bzw. was muss ich ändern?
Die Funktion ist wie folgt definiert:
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:
| TDECCipherClass = class of TDECCipher; TDECCipher = class(TDECObject) private FData: PByteArray; FDataSize: Integer; protected FBufferIndex: Integer; FUserSize: Integer; FBuffer: PByteArray; FVector: PByteArray; FFeedback: PByteArray; FUser: Pointer; FUserSave: Pointer; procedure DoInit(Key: Array of Byte); virtual; abstract; procedure DoEncode(Source, Dest: Pointer); virtual; abstract; public constructor Create; override; class function Context: TCipherContext; virtual; abstract; procedure Init(Key: Array of Byte; IFiller: Byte = $FF); procedure Protect; virtual; procedure Encode(const Source; var Dest); function EncodeBinary(): Binary; published end; |
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: Do 24.07.08 15:03
TDECCipherclass ist eine Metaklasse oder Klassenreferenz. Dies ist ein Zeiger sozusagen auf die abstrakte Klassendefinition, welche keine Instanz benötigt. Alle constructoren fallen normalerweise darunter, weil eben diese ja nicht von einer Instanz aufgerufen werden, sondern diese erst bauen sollen.
normalerweise würde man das einfach so schreiben: DECCipherinstance.init(). In deinem fall mit with kannst du auch einfach init() schreiben, da im with alle Methoden versucht werden auf die with Instanz zu beziehen.
Was du vlt noch optimieren könntest wäre das modulo. Das dürfte selbst in deinem Fall mit sehr kleinen Zahlen noch verhältnismäßig langsam sein.
Am meisten optimieren kann man immer durch einen ganzheitlichen Ansatz anstatt darüber zu philosophieren ob man pchar oder doch lieber array of byte verwendet. Du hast zwar zu einem Teil schon im andern Thread erklärt, aber nicht überaus ausführlich. Ich denke es würde helfen, wenn du einmal bis ins letzte Detail erklärst was du machen möchtest (wozu du überhaupt Schlüssel baust nach welchem Algorithmus du vorgehst also welche Funktion die einzelnen Module haben bisher weiß ich nur alles zusammen soll dann mal ein LM-Hash sein, dne zumindest ich nicht kenne) Was willst du erhalten Passworts oder keys sowie womit du was verschlüsselst und vor allem welche Teile des Codes hast du als Open-Source und darfst du verändern.
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Do 24.07.08 15:21
Allesquarks hat folgendes geschrieben: | | man das einfach so schreiben: DECCipherinstance.init(). In deinem fall mit with kannst du auch einfach init() schreiben, da im with alle Methoden versucht werden auf die with Instanz zu beziehen. |
Schreibe ich nur Init(anf), dann steht dort: Undeclared identifier: Init. Was mache ich falsch?
Allesquarks hat folgendes geschrieben: |
Was du vlt noch optimieren könntest wäre das modulo. Das dürfte selbst in deinem Fall mit sehr kleinen Zahlen noch verhältnismäßig langsam sein. |
modulo? Wo habe ich ein Modulo? Meinst du in den HexStrToString und StringToHexStr? Falls ja, dann kann ich dich beruhigen: Diese Funktion wurde abgeschafft, war nur für mich überraschend, dass er damit schneller war als ohne.
Allesquarks hat folgendes geschrieben: | | Am meisten optimieren kann man immer durch einen ganzheitlichen Ansatz anstatt darüber zu philosophieren ob man pchar oder doch lieber array of byte verwendet. Du hast zwar zu einem Teil schon im andern Thread erklärt, aber nicht überaus ausführlich. Ich denke es würde helfen, wenn du einmal bis ins letzte Detail erklärst was du machen möchtest (wozu du überhaupt Schlüssel baust nach welchem Algorithmus du vorgehst also welche Funktion die einzelnen Module haben bisher weiß ich nur alles zusammen soll dann mal ein LM-Hash sein, dne zumindest ich nicht kenne) |
Okee, ich erklär es möglichst einfach: Ich versuche John the Ripper in einfachster Form nachzubauen. Und zwar gehe ich davon aus, dass ich einen gegebenen LM-Hash habe (LM-Hash wird in der SAM-Datei auf dem PC verwendet, um die Passwörter für die Benutzeraccounts zu speichern.). JTR benötigt ebenfalls den LM-Hash, um das Passwort zu finden. Sein Vorgehen ist folgendes: Er geht alle Kombinationen durch und erstellt während dem Vorgang aus jeder Kombination einen LM-Hash und vergleicht, ob dieser mit dem gegebenen Hash überein stimmt. (Tatsächlich funktioniert er anders, aber dies ist meine Version, wie ich das gerne umsetzen will und wie es auch einfach zu verstehen ist).
Der LM-Hash funktioniert folgendermassen: Zuerst wird ein Key erstellt (dazu wird parityshift und DecodeText benötigt) und anschliessend wird ein fester String (bei LM-Hash ist dies 'KGS!@#$%') mit dem erstellten Key verschlüsselt. Aus diesem Grund muss ich aus jeder Kombination zuerst den Key erstellen und anschliessend noch verschlüsseln.
Natürlich mache ich das Programm nicht einfach so aus langeweile oder weil ich mich kriminell betätigen will, sondern das ganze geschieht im Dienste der Wissenschaft (bei Interesse PN an mich).
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Do 24.07.08 15:48
Hi,
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:
| procedure Gen(); var X, Y, I, Len, p: Integer; Wort: arr8; Key: arr8; begin with TCipher_1DES.Create do begin Len := 0; for X := 0 to 7 do wort[X] := (Ord('A')-65);
inc(wort[0],32); for X := 0 to combs do begin Y := 0; inc(wort[Y]);
while wort[Y] > Ord('z') do begin if (X = 90) or (X = 8190) or (X = 737190) or (X = 66347190) or (X = 5971247190) or (X = 537412247190) then inc(wort[Y + 1],32);
inc(wort[Y + 1]); wort[Y] := ord('!'); inc(Y); Len := max(Y, Len); end; anf:=parityshift(Wort); try Mode := cmECBx; TDECCipher.Init(anf); Result := EncodeBinary('KGS!@#$%', TFormat_HEXL); finally Free; end; end; end; |
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)
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: Do 24.07.08 15:57
Ah siehst du ich dachte du willst dann wirklich einen größeren Text verschlüsseln. Mir ist egal was du damit machst. Vielleicht hast du auch nur dein eigenes Passwort vergessen.
Ok ich versteh gar nichts vom LM, aber wenn ich das richtig verstehe hast du nach der Hälfte einen key mit dem dann codiert/decodiert wird. Falls der immer eine feste länge hat könnte man überlegen den nicht als string oder pchar sondern einfach als "speicher" zu übergeben. Falls du den Quelltext für die gesamte Hash-Funktion hast würde ich dir empfehlen da Teile umzuschreiben. Gar nicht vom Algorithmus her sondern von den Typen.
1.DecodeText gibt string zurück. Vlt kannst du erreichen, dass das Ding ein Pointer auf array of byte oder pchar zurückgibt.
2. Für praityshift gilt glaube ich das gleiche.
3. Hast du vlt schon umgesetzt: den constructor wenn irgend möglich außerhalb einer jeden Schleife aufrufen. Generell ist jede Form von dynamischer Speicherallokation zu vermeiden.
4. In deinen ganzen or's schalte mal per Compiler-Schalter die kurze Boolsche Auswertung ein und mach das unwahrscheinlichste Kriterium nach vorne.
Zum init() keine Ahnung was da nicht passt aber lass doch einfach das with weg. Ist sowieso nur für den Compiler und sollte theoretisch keine Wirkung haben. Wenn eine da ist vermute ich aber eher eine nachteilige.
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Do 24.07.08 16:00
 Vielen Dank! Jetzt muss ich einfach das Free entfernen, da er mir sonst die Schleife zerstört.
Allesquarks hat folgendes geschrieben: | 1.DecodeText gibt string zurück. Vlt kannst du erreichen, dass das Ding ein Pointer auf array of byte oder pchar zurückgibt.
2. Für praityshift gilt glaube ich das gleiche. |
Hm... Irgendwie sollte das schon zu erreichen sein. Bei Parityshift habe ich ja im Moment die Funktion mit einem Array of Byte, und am Schluss steht da noch Result:=*Name des Arrays*. Wenn ich hier jetzt einfach einen Pointer als Resultat zurückgebe, welcher auf den Array zeigt, wäre dann die Aufgabe schon erfüllt oder müsste das ganze mit dem Pointer arbeiten?
Allesquarks hat folgendes geschrieben: | | 4. In deinen ganzen or's schalte mal per Compiler-Schalter die kurze Boolsche Auswertung ein und mach das unwahrscheinlichste Kriterium nach vorne. |
Du meinst wahrscheinlich die Or's in Parityshift, oder? Beide Werte, die da "geord" werden, sind jeweils Byte. Ich dachte immer, da wird dann die Zahl im Binärcode verglichen und die Einsen und Nullen verändert, je nach dem, wie die Konstellation ist, nicht? Oder sind das keine "Logical (bitwise) operators"?
|
|
|