![]() |
Rijnadel in Delphi nicht gleich wie das in PHP
Hallo
Ich habe in Delphi folgende Units eingebunden ![]() Damit erzeuge ich einen Rijndael Verschlüsselten String Benutzen dazu folgenden code
Delphi-Quellcode:
Nun wollte ich in PHP auch den selben Rijndael String erzeugen.
procedure TForm1.Button1Click(Sender: TObject);
begin with TCipher_Rijndael.Create do try Init('Passwort'); showmessage(EncodeBinary('Deins', TFormat_HEX)); finally Free; end; end; Als ich nach ca 1 Stunde endlich die LIBMcrypt zum laufen brachte und auch noch einen Rijndale String bekam, musste ich zu meiner enttäuschung feststellen, das diese nicht identisch sind. Der code dazu:
Code:
Nun meine Fragen:
$key = 'Passwort';
$string = 'Deins'; $td = mcrypt_module_open('rijndael-256', '', 'ofb', ''); $iv_size = mcrypt_enc_get_iv_size($td); $iv = str_repeat(chr(0), $iv_size); if (mcrypt_generic_init($td, $key, $iv) != -1) { $c_t = mcrypt_generic($td, $string); mcrypt_generic_deinit($td); mcrypt_module_close($td); } echo bin2hex($c_t); Wo sehe ich wie hoch die Bitrate ist in Delphi? (128,256..) Weshalb gibt es in Delphi keinen solchen parameter wie in PHP ofb einer ist? Und die wichtigste: Was kann ich tun damit die Strings identisch werden? Ich danke euch schon jetzt für eure Antworten Liebe Grüsse Claudio |
Re: Rijnadel in Delphi nicht gleich wie das in PHP
In deinem PHP-Script benutzt du einen Initialationsvektor:
Code:
In deinem Delphi Code aber nicht.
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = str_repeat(chr(0), $iv_size); |
Re: Rijnadel in Delphi nicht gleich wie das in PHP
probier mal
Delphi-Quellcode:
Allerdings scheint es so das du Rijndael-256Bit benutzt. Wenn das Passwort das du mit Init() übergibts zu kurz ist benutzt DEC intern immer einen Rijndael-128 Bit. Der ist schneller und mit einem zu kurzem Passwort macht eine Verschlüsselung mit mehr als 128 Bit keinen Sinn. Dies sugertiert nur Sicherheit wo keine ist.
with TCipher_Rijndael.Create do
try Mode := cmOFB8; Init('Passwort'); showmessage(EncodeBinary('Deins', TFormat_HEX)); finally Free; end; Versuche als im PHP den 'Rijndeal-128' zu allozieren. Gruß Hagen |
Re: Rijnadel in Delphi nicht gleich wie das in PHP
Doch er nutzt einen IV, geht garnicht anders da man immer einen IV benutzt sobald ein CipherMode <> cmECB benutzt wird ;)
Der Standard-InitVector im DEC ist die Wiederholung von $FF. Möchtest du $00 als IV benutzten dann benutze .Init('Passwort', '', $00); Dabei wird der zb. 8/16 Bytes große IV mit dem Byte $00 gefüllt. Möchtest du einen komplett individuellen IV benutzt dann geht das mit .Init('Passwort', TFormat_HEX.Decode('0102030405060708...')); oder mit .Init(Password[1], Length(Password), IV, SizeOf(IV)); wobei dann IV eine Datenstruktur ist die exakt Cipher.Context.BlockSize Bytes groß sein muß. Es gehen also alle Kombinationen mit fast allen datentypen. Kryptographisch betrachtet sollte man dem IV aber nicht allzuviel Bedeutung beimessen. Es ist besser, statt einem Zufalls-IV, diese Zufallsdatenblock vor die Nachricht zu hängen und dann alles mit festen IV, zb. $FFFFFFFFFFF...FFF, zu verschlüsseln. Der Zufallsdatenblock der also am Anfang der Nachricht steht hat die exakt gleiche Wirkung wie ein externer IV, nur mit dem Untewrschied das er eben verschlüsselt übertragen wird. Ein normaler IV wird unverschlüsselt übertragen. Ergo: die methode den Zufalls-Datenblock in die zu verschl. Naricht einzubetten muß sicherer sein. Gruß Hagen |
Re: Rijnadel in Delphi nicht gleich wie das in PHP
Danke für die Antworten
Doch leider klappt es nicht.... Delphi Code:
Delphi-Quellcode:
Delphi Ausgabe: 095FB1905A
with TCipher_Rijndael.Create do
try Mode := cmOFB8; Init('Passwort', '', $00); showmessage(EncodeBinary('Deins', TFormat_HEX)); finally Free; end; PHP Code:
Code:
PHP Ausgabe: a1e105e433
$key = 'Passwort';
$string = 'Deins'; $td = mcrypt_module_open('rijndael-128', '', 'ofb', ''); $iv_size = mcrypt_enc_get_iv_size($td); $iv = str_repeat(chr(0), $iv_size); if (mcrypt_generic_init($td, $key, $iv) != -1) { $c_t = mcrypt_generic($td, $string); mcrypt_generic_deinit($td); mcrypt_module_close($td); } echo bin2hex($c_t); Ich habe keine ahnung woran das liegen kann... Irgendwass mache ich bestimmt falsch... Ich hoffe ihr seht meinen Fehler :D |
Re: Rijnadel in Delphi nicht gleich wie das in PHP
Erfolg :D
Benutze ich diesen Delphi Code
Delphi-Quellcode:
Und diesen PHP
begin
with TCipher_Rijndael.Create do try Mode := cmECBx; Init('terertertererfrt'); showmessage(EncodeBinary('wertzuioplkjhgfd', TFormat_HEXL)); finally Free; end;
Code:
Dan kommt das gleiche raus...
$key = 'terertertererfrt';
$string = 'wertzuioplkjhgfd'; $td = mcrypt_module_open('rijndael-128', '', 'ecb', ''); $iv_size = mcrypt_enc_get_iv_size($td); $iv = str_repeat(chr(0), $iv_size); if (mcrypt_generic_init($td, $key, $iv) != -1) { $c_t = mcrypt_generic($td, $string); mcrypt_generic_deinit($td); mcrypt_module_close($td); } echo bin2hex($c_t); Aber! Wenn ich in Delphi den zu verschlüsselnden Text ändere, kommt die Meldung:
Code:
Ändere ich hingegen den Text in PHP so gibts einfach einen anderen verschlüsselten Text :D
Messagelength for cmECBx must be a multiple of 16 bytes.
Was muss ich tun, damit ich mehr als 16 Bytes verschlüsseln kann? Schlussendlich sollen damit auch Dateien ver und entschlüsselt werden... Danke schonmal |
Re: Rijnadel in Delphi nicht gleich wie das in PHP
Delphi-Quellcode:
ergibt bei mir a1e105e433.
with TCipher_Rijndael.Create do
try Mode := cmOFB8; Init('Passwort', #0, $00); WriteLn(EncodeBinary('Deins', TFormat_HEX)); finally Free; end; ECB ist ein Modus der immer ganze Blöcke verschlüsseln muß, es gibt bei diesem kein Padding. Wenn also PHP ohne Fehlermeldung es zulässt und man zb. eine 17 Bytes lange Nachricht in diesem Modus verschlüsseln kann, dann ist dies verfahrenstechnisch unsicher. ECB heist Electronic Codebook und das heist soviel wie: lasse den Cipher arbeiten ohne irgendwelches Post-/Preprocessing, ohne Feedback Verküpfungen der Datenblöcke untereinander, damit die vielen Programmierer mit ihren unterschiedlichen Programmirsprachen eine gemeinsamme Basis besitzen mit der man eine Querüberprüfung der Implementationen machen kann. ECB sollte man also niemals so nackig für reale Verschlüsselungen benutzen, es sei denn die Nachrichten sind aus Zufall. Da AES ein Blockciophr ist und mit Blöcken a 16 Bytes arbeitet wird er also die Nachricht in Blöcken a 16 Bytes Länge zerlegen und jeden Block separat verschlüsseln. Da jeder Blockcipher so nur Blockweise richtig ver- und wieder entschlüsseln kann heist dies das eine Nachricht auf eine Länge erweitert werden muß die durch 16 ohne Probleme teilbar ist. Andere Blockcipher benutzen zb. 8 Bytes oder 12 Bytes Blockgröße, je nach Algorithmus. Die Fehlermeldung vom DEC ist also ein Hinweis darauf das du was machen möchtest das technisch nicht korrekt funktionieren kann und kryptographisch keinen Sinn ergibt (ausser um zu testen ob der Programierer der Library seine Arbeit richtig gemacht hat und solche Fehlbenutzungen unterbindet, naja PHP halt ;) ) Gruß Hagen |
Re: Rijnadel in Delphi nicht gleich wie das in PHP
Woow
Hab vielen Dank hagen für deinen Sehr Interessanten und Langen Beitrag :D Ich denke ich weis nun wesshalb es bei mir nicht geklappt hat, Ich hab #0 nicht geschrieben.... Jiip grad getestet es war das :D Danke nochmal |
Re: Rijnadel in Delphi nicht gleich wie das in PHP
Falls es darum
![]() Gruß hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 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