Опитвам се да използвам библиотеката 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. Може би някой може да ми каже как това внедряване се различава от mcrypt на PHP с 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 скрипта? Или познаването на ключа е достатъчно, като за ECB?