AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCRYPT)

PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCRYPT)

Ein Thema von walter_b · begonnen am 15. Jul 2008 · letzter Beitrag vom 29. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2   
walter_b

Registriert seit: 15. Jul 2008
11 Beiträge
 
Delphi 6 Personal
 
#1

PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCRYPT)

  Alt 15. Jul 2008, 18:09
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.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#2

Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR

  Alt 15. Jul 2008, 19:36
Herzlich Willkommen in der DP, walther_b!

Zitat von walter_b:
In PHP ist sie eine Standard-Funktion, während es sie in Delphi wohl nicht gibt.
Das stimmt nicht, die Funktion ist bei PHP aus dem mcrypt Library und nicht bei jedem Server mit PHP dabei.

Zitat von walter_b:
das ganze möglichst Geschwindigkeitsoptimiert funktionieren würde.
Die DEC ist sehr hoch optimiert auf Geschwindigkeit, das sollte kein Problem sein. Und schneller als der interpretierte Code von einem PHP Skript ist Delphi auf jeden Fall

Zu Deiner Frage:
Grob gesagt verschlüsselt man mit dem DEC 5.1 so:
Delphi-Quellcode:
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;
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?!).

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
Frederik
  Mit Zitat antworten Zitat
walter_b

Registriert seit: 15. Jul 2008
11 Beiträge
 
Delphi 6 Personal
 
#3

Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR

  Alt 15. Jul 2008, 20:44
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?
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#4

Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR

  Alt 15. Jul 2008, 21:25
Hi walter_b!
Zitat von walter_b:
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?
Nein, die paar Zeilen pasten geht sowieso nicht und sowas sollte man auch nicht tun, wenn man nicht versteht, was man kopiert. Diese sind ein Anwendungsbeispiel und würden so nicht compilieren.

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 von walter_b:
Ich habe da ein paar DES gefunden, weiss aber nicht, welches meiner Vorstellung entspricht.
Weisst du zufälligerweise mehr darüber, welches ich benutzen muss?
Ich kann doch nicht hellsehen

Wenn ich bei mir die Unit DECCipher.pas öffne, steht dort aber etwas mehr:
Delphi-Quellcode:
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}
Wie mcrypt zu benutzen ist, steht ja unter http://de3.php.net/mcrypt_ecb. Also gehe ich davon aus - ohne mcrypt zu kennen - es handelt sich um einen einfachen DES Cipher und kein Triple DES. Zusätzlich schließe ich aus Deinen Parametern für mcrypt, daß Du libmcrypt 2.2.x verwendest.

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:
TCipherMode = (cmCTSx, cmCBCx, cmCFB8, cmCFBx, cmOFB8, cmOFBx, cmCFS8, cmCFSx, cmECBx); Das führt zu etwas wie:
Delphi-Quellcode:
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;
Das ganze ist nur aus dem Kopf und nicht geprüft! Es kann sein, daß Du etwas anderes als TFormat_HEXL verwenden mußt...

Jetzt habe ich ja doch Deine Arbeit gemacht
Naja, es ist ja Dein Einstand hier und mal sehen, was noch so kommt von Deiner Seite.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
walter_b

Registriert seit: 15. Jul 2008
11 Beiträge
 
Delphi 6 Personal
 
#5

Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR

  Alt 16. Jul 2008, 16:49
Vielen Dank! Tut mir leid, ich stand am Anfang echt voll auf dem Schlauch und hatte keine Ahnung, wie ich weitermachen sollte.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#6

Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR

  Alt 16. Jul 2008, 21:03
Zitat von walter_b:
Vielen Dank! Tut mir leid, ich stand am Anfang echt voll auf dem Schlauch und hatte keine Ahnung, wie ich weitermachen sollte.
Dann ist es ja kein Problem, freut mich Dir helfen zu können!

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
walter_b

Registriert seit: 15. Jul 2008
11 Beiträge
 
Delphi 6 Personal
 
#7

Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR

  Alt 28. Jul 2008, 19:18
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:
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;
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:

Delphi-Quellcode:
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;
Wobei hier der "Key" der Hash-Wert ist, welcher vorhin bei EncodeBinary rauskam. Jedoch meldet er mir bei meinem Inputtext 'KGS!@#$%' folgendes:

Zitat von Delphi:
... raised exception clasds EDECExeption with message 'Input is not an valid HEXL Format.'. Process stopped.
Was soll dieser Schwachsinn? Wieso kann ich es mit diesem Wert verschlüsseln, wenn ich es mit dem selben Wert nicht rückverschlüsseln kann? Wie kann ich diese Problem umgehen?
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#8

Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR

  Alt 28. Jul 2008, 20:45
Hi walter_b,

zunächst mal aus der DECFmt.pas:
Delphi-Quellcode:
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
Jetzt zu Deinem Source, da hast Du leider per Copy-Paste, ohne es zu verstehen, meinen Blödsinn einfach übernommen

Probier mal folgendes
Delphi-Quellcode:
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;
Beachte:
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 von walter_b:
Wobei hier der "Key" der Hash-Wert ist, welcher vorhin bei EncodeBinary rauskam.
Falsch. Das ist ganz sicher kein Hash...

Die Funktion arbeitet nach dem Prinzip:
Input = Eingabe-Text
Key = Passwort im Klartext (bei beiden Funktionen!)
Result = Ergebnis

Zitat von walter_b:
Zitat von Delphi:
... raised exception class EDECExeption with message 'Input is not an valid HEXL Format.'. Process stopped.
Was soll dieser Schwachsinn? Wieso kann ich es mit diesem Wert verschlüsseln, wenn ich es mit dem selben Wert nicht rückverschlüsseln kann? Wie kann ich diese Problem umgehen?
Das frage ich mich auch. Willst Du Deinen Blödsinn etwa dem Delphi Compiler or dem Autoren anlasten?

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
walter_b

Registriert seit: 15. Jul 2008
11 Beiträge
 
Delphi 6 Personal
 
#9

Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR

  Alt 28. Jul 2008, 23:26
Zitat von Assertor:
Jetzt zu Deinem Source, da hast Du leider per Copy-Paste, ohne es zu verstehen, meinen Blödsinn einfach übernommen
Da hast du dich wohl diesmal, so leid es mir tut, getäuscht. Nur weil ich den Titel der Funktion nicht auf die darin enthaltene Funktion angepasst habe, heisst das nicht, dass ich es nicht verstanden habe. Mir ging es zuerst einmal darum, das ganze zum laufen zu bringen, und erst dann den "Zuckerguss" zu machen. Und noch kurz wegen dem nicht verstehen... Mittlerweile habe ich die ganze DEC auseinander genommen, um den Vorgang von EncodeBinary zu verstehen...



Zitat von Assertor:
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.
Es ist mein Ziel, nur diesen einen Input-Text zu verschlüsseln. Einzig und alleine der Key variiert.


Zitat von Assertor:
4) Du verwendest einfaches DES ohne SALT und IV (Initialisierungsvektor). Hart gesagt: Dann brauchst Du im Prinzip auch garnicht zu verschlüsseln.
Die Verschlüsselung, die ich hier nachstellen will, stammt nicht von mir. Von da her spielt es keine Rolle, ob die Verschlüsselung Sinn macht, oder nicht.


Zitat von Assertor:
Zitat von walter_b:
Zitat von Delphi:
... raised exception class EDECExeption with message 'Input is not an valid HEXL Format.'. Process stopped.
Was soll dieser Schwachsinn? Wieso kann ich es mit diesem Wert verschlüsseln, wenn ich es mit dem selben Wert nicht rückverschlüsseln kann? Wie kann ich diese Problem umgehen?
Das frage ich mich auch. Willst Du Deinen Blödsinn etwa dem Delphi Compiler or dem Autoren anlasten?
Tut mir leid, dass ich mich da unklar ausgedrückt habe... "Was soll der Schwachsinn, welchen ich hier wieder zusammengebaut habe" wäre die vollständige Frage gewesen, wollte niemandem etwas anhängen.


Und jetzt noch zurück zum Code (ich verwende der Klarheit halber wieder die statische Funktion mit einem Parameter:


Delphi-Quellcode:
function EncodeText(Key: String): String;
begin
  with TCipher_1DES.Create do
  try
    Mode := cmECBx;
    Init(Key);
    Result := EncodeBinary('KGS!@#$%');
  finally
    Free;
  end;
end;
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.
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?
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#10

Re: PHP in Pascal:mcrypt_ecb(MCRYPT_DES, $a, $b, MCRYPT_ENCR

  Alt 29. Jul 2008, 11:00
Hi walter_b,

Zitat von walter_b:
Die Verschlüsselung, die ich hier nachstellen will, stammt nicht von mir. Von da her spielt es keine Rolle, ob die Verschlüsselung Sinn macht, oder nicht.
Zugestanden. Aber trotzdem darf ich darauf hinweisen, bevor hier jemand diesen Thread liest und sich denkt: Ach, so geht das - das ist dann ja auch bestimmt sicher...

Zitat von walter_b:
Tut mir leid, dass ich mich da unklar ausgedrückt habe... "Was soll der Schwachsinn, welchen ich hier wieder zusammengebaut habe" wäre die vollständige Frage gewesen, wollte niemandem etwas anhängen.
Ok.

Zitat von walter_b:
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' ).
Nein, Deine Funktion macht folgendes: Sie nimmt ein Passwort (welches variiert) und verschlüsselt einen vorgegeben Text. Wenn TFormat_HEXL fehlt, ist das Ausgabeformat = Eingabeformat. Ein Hash kommt in diesen Funktionen nicht vor.

Zitat von walter_b:
Da DecodeText allerdings auch den Key benötigt, funktioniert in diesem Falle die Umkehrfunktion nicht, oder?
Hash und Verschlüsselung sind zwei Paar Schuhe. Ein Hash ist (sollte) nie umkehrbar sein. Eine Verschlüsselung unter Nutzung des Passwortes schon. Wenn man das Passwort einer Verschlüsselung nicht kennt und alle Möglichen durchprobiert, ist das ein Bruteforce-Atttacke. Damit versucht man, den Text zu entschlüsseln ohne das Passwort zu kennen.

Beispiele für Hash-Funktionen, siehe http://de.wikipedia.org/wiki/Hash:
- 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 http://de.wikipedia.org/wiki/Symmetr...l%C3%BCsselung:
- DES
- 3DES
- AES (Rijndael) 128

Um diese Umzukehren muß man natürlich prinzipiell das Passwort kennen.

Zitat von walter_b:
Da hast du dich ... getäuscht. ... heisst das nicht, dass ich es nicht verstanden habe.
Nun gut, aufgrund Deiner Frage vermutete ich das wegen Hash != Verschlüsselung...

Zitat von walter_b:
Es ist mein Ziel, nur diesen einen Input-Text zu verschlüsseln. Einzig und alleine der Key variiert.
Sag doch mal, was Du genau machen möchtest. Möchtest Du einen vorhandenen Text entschlüsseln? Das sieht mir derzeit nämlich nach einem Versuch für 1DES-Bruteforce aus, was ja prinzipiell nicht schlimm wäre

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.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz