Я пытаюсь использовать библиотеку DEC 3.0 (Delphi Encryption Compedium Part I) для шифрования данных в Delphi 7 и отправки их в сценарий PHP через POST, где я расшифровываю их с помощью mcrypt (RIJNDAEL_256, режим ECB).
Часть Delphi:
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-скрипт? Или достаточно знания ключа, как для ЕЦБ?