![]() |
PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCRYPT)
Hallo zusammen
Ich würde gerne den PHP-Code, wie er im Titel angegeben ist, ins Delphi "übersetzen". Diese Zeile ist aus einem PHP-Skript und ich würde sie gerne in mein Delphiprogramm einbauen, doch dafür bräuchte ich diese Funktion. In PHP ist sie eine Standard-Funktion, während es sie in Delphi wohl nicht gibt. Aus diesem Grund habe ich DEC 5.1 downgeloadet, aber irgendwie finde ich mich nicht wirklich zurecht. Wäre toll, wenn das ganze möglichst Geschwindigkeitsoptimiert funktionieren würde. Im Voraus herzlichen Dank für eure Bemühungen. |
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Herzlich Willkommen in der DP, walther_b!
Zitat:
Zitat:
Zu Deiner Frage: Grob gesagt verschlüsselt man mit dem DEC 5.1 so:
Delphi-Quellcode:
Da Du nun bei Deinem PHP Skript keinen Salt hast und das Schlüsselverfahren ECB statt KDF ist, muß Du dies noch entsprechend anpassen. Als CipherClass nimmst Du den DES (falls es den im DEC noch gibt - der ist ja hochgradig veraltet?!).
var
ASalt: Binary; AData: Binary; APass: Binary; ... begin try with ValidCipher(ACipherClass).Create, Context do try ASalt := RandomBinary(16); Mode := ACipherMode; APass := ValidHash(AHashClass).KDFx(APassword, ASalt, KeySize, TFormat_Copy, AKDFIndex); Init(APass); AData := ASalt + EncodeBinary(AText) + CalcMAC; Result := ValidFormat(ATextFormat).Encode(AData); finally Free; ProtectBinary(ASalt); ProtectBinary(AData); ProtectBinary(APass); end; except Raise; end; end; Schau Dir auch bitte die Tutorials bzw. Demos zu DEC an - wenn Du dann konkrete Fragen hast, stelle diese gerne. Aber Deine Arbeit kann ich nicht für Dich machen ;) Gruß Assertor |
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Dann habe ich doch gleich mal zwei konkrete Fragen:
- Wie sieht es mit der Benutzung von DEC aus? Muss ich mich da wirklich an das ganze Ding binden, indem ich es bei Uses angebe, oder kann ich einfach die paar wenigen entsprechenden Zeilen in mein Programm reinpasten? Oder gehört noch mehr als dies rein? - Ich habe da ein paar DES gefunden, weiss aber nicht, welches meiner Vorstellung entspricht. TCipher_1DES - any DES variant TCipher_2DES TCipher_3DES TCipher_2DDES TCipher_3DDES TCipher_3TDES Weisst du zufälligerweise mehr darüber, welches ich benutzen muss? |
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Hi walter_b!
Zitat:
Und ja, Du mußt die vollständige Unit einbinden. Verschlüsselung ist etwas komplexes - dies läßt sich nicht in einer Hand voll Zeilen durchführen. Aber zum Glück nimmt Dir das DEC die Arbeit ab. Zitat:
Wenn ich bei mir die Unit DECCipher.pas öffne, steht dort aber etwas mehr:
Delphi-Quellcode:
Wie mcrypt zu benutzen ist, steht ja unter
TCipher_1DES = class; {Single DES 8 byte Blocksize, 8 byte Keysize 56 bits relevant}
TCipher_2DES = class; {Triple DES 8 byte Blocksize, 16 byte Keysize 112 bits relevant} TCipher_3DES = class; {Triple DES 8 byte Blocksize, 24 byte Keysize 168 bits relevant} TCipher_2DDES = class; {Triple DES 16 byte Blocksize, 16 byte Keysize 112 bits relevant} TCipher_3DDES = class; {Triple DES 16 byte Blocksize, 24 byte Keysize 168 bits relevant} TCipher_3TDES = class; {Triple DES 24 byte Blocksize, 24 byte Keysize 168 bits relevant} ![]() Das ganze ist unter der PHP Infoseite zusätzlich als "deprecated" gekennzeichnet, also sollte es so nicht mehr gemacht werden... Auf jeden Fall wäre der Cipher hier also TCipher_1DES. Zusätzlich verwendest Du mcrypt ohne IV Initialisierungsvektor (das ist schonmal nicht so gut) - hier wäre also der IV leer. Wegen Deines mcrypt Aufrufs suchst Du Dir also aus dem TCipherMode einen mit ECB heraus:
Delphi-Quellcode:
Das führt zu etwas wie:
TCipherMode = (cmCTSx, cmCBCx, cmCFB8, cmCFBx, cmOFB8, cmOFBx, cmCFS8, cmCFSx, cmECBx);
Delphi-Quellcode:
Das ganze ist nur aus dem Kopf und nicht geprüft! Es kann sein, daß Du etwas anderes als TFormat_HEXL verwenden mußt...
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; Jetzt habe ich ja doch Deine Arbeit gemacht :roll: Naja, es ist ja Dein Einstand hier und mal sehen, was noch so kommt von Deiner Seite. Gruß Assertor |
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Vielen Dank! Tut mir leid, ich stand am Anfang echt voll auf dem Schlauch und hatte keine Ahnung, wie ich weitermachen sollte.
|
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Zitat:
Gruß Assertor :cat: |
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Hm... Die Funktion, die du mir damals vorgeschlagen hast, hat wunderbar funktioniert. Jedoch habe ich mir überlegt, ob ich das ganze auch umgekehrt verwenden kann. Hier nochmal der Code, wie er von mir angewandt wurde:
Delphi-Quellcode:
In der DEC hat es ja auch ein DecodeBinary. Soviel ich weiss, sollte dies ja eigentlich genau das umgekehrte von dem machen, was EncodeBinary macht. Aus diesem Grund habe ich mal selbst was umgebaut, welches den Grundanforderungen der Funktionendefinition entspricht:
function DecodeText(Key: String): String;
begin with TCipher_1DES.Create do try Mode := cmECBx; Init(Key); Result := EncodeBinary('KGS!@#$%', TFormat_HEXL); finally Free; end; end;
Delphi-Quellcode:
Wobei hier der "Key" der Hash-Wert ist, welcher vorhin bei EncodeBinary rauskam. Jedoch meldet er mir bei meinem Inputtext 'KGS!@#$%' folgendes:
function DecodeText(Key: String): String;
begin with TCipher_1DES.Create do try Mode := cmECBx; Init(Key); Result := DecodeBinary('KGS!@#$%', TFormat_HEXL); finally Free; end; end; Zitat:
|
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Hi walter_b,
zunächst mal aus der DECFmt.pas:
Delphi-Quellcode:
Jetzt zu Deinem Source, da hast Du leider per Copy-Paste, ohne es zu verstehen, meinen Blödsinn einfach übernommen :roll:
TFormat_Copy = class; // copy input to output, it's the Default Format, eg FormaClass = nil
TFormat_HEX = class; // HEXadecimal in UpperCase TFormat_HEXL = class; // HEXadecimal in Lowercase TFormat_MIME32 = class; // MIME like format for Base 32 TFormat_MIME64 = class; // MIME Base 64 format TFormat_PGP = class; // PGP's MIME Base 64 with PGP's Checksums TFormat_UU = class; // Unix UU Base 64 TFormat_XX = class; // Unix XX base 64 TFormat_ESCAPE = class; // Escaped Strings Probier mal folgendes
Delphi-Quellcode:
Beachte:
function EncodeText(Input, Key: String): String;
begin with TCipher_1DES.Create do try Mode := cmECBx; Init(Key); Result := EncodeBinary(Input); // bitte bei EncodeText() auch EncodeBinary nutzen und NICHT DecodeBinary! finally Free; end; end; function DecodeText(Input, Key: String): String; begin with TCipher_1DES.Create do try Mode := cmECBx; Init(Key); Result := DecodeBinary(Input); // hier stand bei Dir DecodeBinary('abc', TFormat_HEXL); finally Free; end; end; 1) Hinter EncodeBinary/DecodeBinary kannst Du einen zweiten Parameter angeben, z.B. EncodeBinary(Input, TFormat_HEXL). Damit werden die Eingabe/Ausgabedaten formatiert, d.h. es wird ein bestimmtes Eingabeformat erwartet bzw. ausgegeben. 2) Dein Fehler kommt dann auch daher: Du gibst, wie in meiner ersten Antwort, TFormat_HEXL an - aber bei Deinem Source wird etwas anderes genutzt, als Daten im HEX Format... 3) Zudem solltest Du, wenn Du schon den Key per Funktionsparameter übergibst, auch den Input/Outputtext per Parameter übergeben. Sonst kann die Funktion ja nur den -einen- vorgegeben Text ver/entschlüsseln. 4) Du verwendest einfaches DES ohne SALT und IV (Initialisierungsvektor). Hart gesagt: Dann brauchst Du im Prinzip auch garnicht zu verschlüsseln. Zitat:
Die Funktion arbeitet nach dem Prinzip: Input = Eingabe-Text Key = Passwort im Klartext (bei beiden Funktionen!) Result = Ergebnis Zitat:
Gruß Assertor |
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Zitat:
Zitat:
Zitat:
Zitat:
Und jetzt noch zurück zum Code (ich verwende der Klarheit halber wieder die statische Funktion mit einem Parameter:
Delphi-Quellcode:
Diese Funktion erstellt mir aus einem ziemlich verunstalteten (undruckbare ASCII-Zeichen und doch sehr spezielle, andere Sonderzeichen) String einen Hexadezimal-Hash mit einer Länge von 16 Stellen (z.b. '90004151ADA7B438' ). Da der Inputtext fest gesetzt ist, ist also der Key von Bedeutung.
function EncodeText(Key: String): String;
begin with TCipher_1DES.Create do try Mode := cmECBx; Init(Key); Result := EncodeBinary('KGS!@#$%'); finally Free; end; end; Da DecodeText allerdings auch den Key benötigt, funktioniert in diesem Falle die Umkehrfunktion nicht, oder? Oder ist es möglich, den Key anhand des Input- und des Output-textes rauszufinden? |
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Hi walter_b,
Zitat:
Zitat:
Zitat:
Zitat:
Beispiele für Hash-Funktionen, siehe ![]() - MD5 (sehr alt) - RIPEMD-160 - SHA-512 - Whirlpool Vereinfacht: Ein Hash erstellt aus einer beliebigen Datenmenge genau einen Hash (Attacken außen vor). Stell Dir vor, Du nimmst Dir die gesammelten Werke von Shakespear und der Hash aller Seiten wäre "1234567890". Dann kann man das NICHT umkehren. Du kannst mit einem Hash nur vergleichen, Authentizität prüfen etc. Beispiele für Verschlüsselungsalgorithmen, siehe ![]() - DES - 3DES - AES (Rijndael) 128 Um diese Umzukehren muß man natürlich prinzipiell das Passwort kennen. Zitat:
Zitat:
Die Funktionen, die ich zuletzt gepostet habe funktionieren einwandfrei. Das habe ich getestet... Ich würde Dir gerne weiter helfen, aber es wäre wirklich leichter, wenn Du mal sagst, was Du genau machen möchtest. :glaskugel: Gruß Assertor |
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Zitat:
Zu Deinem Beispiel: Wie könnte Shakespear beweisen, daß seine Werke von ihm sind, jeder kann "1234567890" ausrechnen. Das es schwer ist, die Werke zu so ändern, daß immer noch "1234567890" rauskommt, hat nichts mit Authentizität zu tun. Gruß Gammatester |
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Hi gammatester,
Zitat:
Ich muß Dir aber klar widersprechen, Du liest einen falschen Zusammenhang aus meinem Post heraus: Zitat:
Gruß Assertor |
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Delphi-Quellcode:
Ist hier hässlicherString=ergebnis2? Allerdings war jetzt meine Frage, ob ich damit richtig liege, dass dies NICHT stimmt. Denn bei mir ist ja das Problem, dass der Input-Text konstant ist, und der Key ungewiss ist. Normalerweise müsste für die Decode-Funktion das umgekehrte der Fall sein, oder? Ich meine damit, grundsätzlich müsste der Key gegeben sein und er Inputtext gesucht sein, nicht? Gibt es eine Möglichkeit, die Funktion so umzukehren, dass ich von meinem Hash und dem Inputtext auf den Key schliessen kann?
function EncodeText(Key: String): String;
begin with TCipher_1DES.Create do try Mode := cmECBx; Init(Key); Result := EncodeBinary('KGS!@#$%'); finally Free; end; end; function DecodeText(Key: String): String; begin with TCipher_1DES.Create do try Mode := cmECBx; Init(Key); Result := DecodeBinary('KGS!@#$%'); finally Free; end; end; var hässlicherstring, ergebnis, ergebnis2: string; begin ergebnis:=EncodeText(hässlicherString); ergebnis2:=DecodeText(ergebnis) if (hässlicherString=ergebnis2) then ... |
Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR
Hi walter_b,
bitte hab Verstädnis, daß ich keine Zeit habe mich jetzt in die Rechtslage bezüglich des Entschlüsselns des LM-Hash einzulesen. Ich kann Dir da leider nicht weiterhelfen. Der prinzipielle Aufbau ist ![]() Du kamst mit Deinem Post aus dem Bereich PHP und wolltest ein Pendant dazu mit DEC für Delphi haben. Das ist nun erledigt, daher denke ich, es ist besser ein neues Thema zur LM-Hash Entschlüsselung aufzumachen. Gruß Assertor |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz