Я пытаюсь использовать библиотеку DEC 3.0 ( Delphi Encryption Compedium Part I ) для шифрования данных в Delphi 7 и отправки их в скрипт PHP через POST, где я нахожусь расшифровав его с помощью mcrypt (RIJNDAEL_256, режим ECB).
Delphi part:
uses Windows, DECUtil, Cipher, Cipher1;
function EncryptMsgData(MsgData, Key: string): string;
var RCipher: TCipher_Rijndael;
begin
RCipher:= TCipher_Rijndael.Create(KeyStr, nil);
RCipher.Mode:= cmECB;
Result:= RCipher.CodeString(MsgData, paEncode, fmtMIME64);
RCipher.Free;
end;
PHP часть:
function decryptMsgContent($msgContent, $sKey) {
return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sKey, base64_decode($msgContent), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND));
}
Проблема заключается в том, что дешифрование из PHP не работает, и вывод является бессмысленным, что отличается от фактических данных.
Конечно, Delphi Key
и PHP $Key
- это одна и та же строка из 24 символов.
Теперь я знаю, что DEC 3.0 является устаревшим и устаревшим, и я не являюсь экспертом в области шифрования и не могу сказать, является ли это на самом деле Rijndael 256. Может быть, кто-то может сказать мне, как эта реализация отличается от PHP mcrypt w / RIJNDAEL_256 , Возможно, размер ключа другой, или размер блока, но не могу сказать это по коду. Вот выдержка из Cipher1.pas:
const
{ don’t change this }
Rijndael_Blocks = 4;
Rijndael_Rounds = 14;
class procedure TCipher_Rijndael.GetContext(var ABufSize, AKeySize, AUserSize: Integer);
begin
ABufSize := Rijndael_Blocks * 4;
AKeySize := 32;
AUserSize := (Rijndael_Rounds + 1) * Rijndael_Blocks * SizeOf(Integer) * 2;
end;
Дополнительный вопрос:
Я знаю, что режим ECB не рекомендуется, и я буду использовать CBC, как только заработаю ECB. Вопрос в том, должен ли я также передавать сгенерированный IV в Delphi в скрипт PHP? Или знание ключа достаточно, как для ЕЦБ?