Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Rijnadel in Delphi nicht gleich wie das in PHP (https://www.delphipraxis.net/108492-rijnadel-delphi-nicht-gleich-wie-das-php.html)

hedie 14. Feb 2008 17:13


Rijnadel in Delphi nicht gleich wie das in PHP
 
Hallo

Ich habe in Delphi folgende Units eingebunden

http://www.michael-puff.de/Developer...agen_Reddmann/

Damit erzeuge ich einen Rijndael Verschlüsselten String

Benutzen dazu folgenden code
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
with TCipher_Rijndael.Create do
try
  Init('Passwort');
  showmessage(EncodeBinary('Deins', TFormat_HEX));
finally
  Free;
end;
end;
Nun wollte ich in PHP auch den selben Rijndael String erzeugen.

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:
$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);
Nun meine Fragen:

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

Luckie 14. Feb 2008 20:10

Re: Rijnadel in Delphi nicht gleich wie das in PHP
 
In deinem PHP-Script benutzt du einen Initialationsvektor:
Code:
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = str_repeat(chr(0), $iv_size);
In deinem Delphi Code aber nicht.

negaH 14. Feb 2008 20:12

Re: Rijnadel in Delphi nicht gleich wie das in PHP
 
probier mal

Delphi-Quellcode:
with TCipher_Rijndael.Create do
try
  Mode := cmOFB8;
  Init('Passwort');
  showmessage(EncodeBinary('Deins', TFormat_HEX));
finally
  Free;
end;
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.

Versuche als im PHP den 'Rijndeal-128' zu allozieren.

Gruß Hagen

negaH 14. Feb 2008 20:19

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

hedie 14. Feb 2008 22:39

Re: Rijnadel in Delphi nicht gleich wie das in PHP
 
Danke für die Antworten

Doch leider klappt es nicht....

Delphi Code:
Delphi-Quellcode:
with TCipher_Rijndael.Create do
try
  Mode := cmOFB8;
  Init('Passwort', '', $00);
  showmessage(EncodeBinary('Deins', TFormat_HEX));
finally
  Free;
end;
Delphi Ausgabe: 095FB1905A

PHP Code:
Code:
$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);
PHP Ausgabe: a1e105e433

Ich habe keine ahnung woran das liegen kann...

Irgendwass mache ich bestimmt falsch... Ich hoffe ihr seht meinen Fehler :D

hedie 15. Feb 2008 10:03

Re: Rijnadel in Delphi nicht gleich wie das in PHP
 
Erfolg :D

Benutze ich diesen Delphi Code

Delphi-Quellcode:
begin
with TCipher_Rijndael.Create do
try
  Mode := cmECBx;
  Init('terertertererfrt');
  showmessage(EncodeBinary('wertzuioplkjhgfd', TFormat_HEXL));
finally
  Free;
end;
Und diesen PHP

Code:
$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);
Dan kommt das gleiche raus...

Aber! Wenn ich in Delphi den zu verschlüsselnden Text ändere, kommt die Meldung:

Code:
Messagelength for cmECBx must be a multiple of 16 bytes.
Ändere ich hingegen den Text in PHP so gibts einfach einen anderen verschlüsselten Text :D

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

negaH 15. Feb 2008 14:25

Re: Rijnadel in Delphi nicht gleich wie das in PHP
 
Delphi-Quellcode:
  with TCipher_Rijndael.Create do
  try
    Mode := cmOFB8;
    Init('Passwort', #0, $00);
    WriteLn(EncodeBinary('Deins', TFormat_HEX));
  finally
    Free;
  end;
ergibt bei mir a1e105e433.

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

hedie 15. Feb 2008 14:33

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

negaH 15. Feb 2008 16:54

Re: Rijnadel in Delphi nicht gleich wie das in PHP
 
Falls es darum http://www.delphipraxis.net/internal...363&highlight= geht dann findest du am Ende einen fertigen Source um Rapidshare-was-weiß-ich zu ver-/entschlüsseln.

Gruß hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 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