Einzelnen Beitrag anzeigen

jus

Registriert seit: 22. Jan 2005
343 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Delphi DEC Rijndael/AES zu PHP mcrypt

  Alt 17. Jul 2015, 10:55
Ok. Nach einbißchen herumprobieren, denke ich, habe ich es hingekriegt.
Für den Fall, dass einer auch mal von Delphi DEC Rijndael 128bit verschlüsselt zu PHP was schicken möchte. Die einfachste Möglchkeit ist, wenn man den CFB 8-bit Modus verwendet.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TCipher_Rijndael.Create do
  try
    Mode := cmCFB8;
    Init('terertertererfrt', #0, $00);
    Memo1.Lines.Add(EncodeBinary('wertzuioplkjhgfd1', TFormat_HEX));
  finally
    Free;
  end;
end;
Delphi Output:
Code:
6E9C9C3D1671348F99A30F350A734A1E28


Anbei der zugehörige PHP Code mit dem selben Output:
PHP-Quellcode:
$string = 'wertzuioplkjhgfd1';
$key = 'terertertererfrt';
$td = mcrypt_module_open('rijndael-128', '', 'cfb', '');
$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 Output:
Code:
6e9c9c3d1671348f99a30f350a734a1e28
Weiters habe ich herausgefunden, dass wenn man unter DEC 5.2 in Delphi den Modus auf Mode := cmCBCx; umstellt und die Nachrichtenlänge ein vielfaches von 16Bytes groß ist, exakt den selben Output wie PHP generiert, wenn man in PHP auf $td = mcrypt_module_open('rijndael-128', '', 'cbc', ''); umstellt. Sprich, wenn man sich selber um das Padding kümmert, und zwar den letzten Block immer auf 16Bytes auffüllt, könnte man auch den CBC Modus mit der Blockgrösse 16Bytes verwenden, was vielleicht bei großen Datenmengen performanter sein kann.

Lg,
jus

Geändert von jus (17. Jul 2015 um 11:12 Uhr)
  Mit Zitat antworten Zitat