Ik probeer met Lazarus een String te ontsleutelen welke met PHP versleuteld is.
De PHP code ziet er als volgt uit:
Code:
if(!function_exists("my_encrypt")) {
function my_encrypt($data, $key)
{
// Remove the base64 encoding from our key
$encryption_key = base64_decode($key);
// Generate an initialization vector
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-CBC'));
// Encrypt the data using AES 256 encryption in CBC mode using our encryption key and initialization vector.
$encrypted = openssl_encrypt($data, 'AES-256-CBC', $encryption_key, 0, $iv);
// The $iv is just as important as the key for decrypting, so save it with our encrypted data using a unique separator (::)
return base64_encode($encrypted . '::' . $iv);
}
}
De $key variabele is een constante en ook in het Lazarus programma bekend.
De IV (initialisatie Vektor) wordt achter de versleutelde string aangeplakt en gescheiden door ::
De versleutelde string is opgelagen in een MySQL database en deze wordt door Lazarus uitgelezen via .ZEOS.
Hieronder de code voor de ontsleuteling:
Code:
function my_decrypt(data:string; key:string) : String;
var
index, dataLength, bsize, pad: integer;
datarr : TArrayOfString;
Cipher : TDCP_rijndael;
decryptedstr : String;
DataString, encryption_key, IV : AnsiString;
begin
datarr := SplitString('::', DecodeStringBase64(data), 2);
encryption_key := DecodeStringBase64(key);
IV := datarr[1];
DataString := datarr[0];
Cipher := TDCP_rijndael.Create(nil);
Cipher.Init(encryption_key[1],Length(encryption_key)*8,@IV[1]);
Cipher.CipherMode:= cmCBC;
Cipher.DecryptCBC(DataString[1],DataString[1],Length(DataString));
my_decrypt := DataString;
Cipher.Free;
end;
Als ik check in Lazarus, dan klopt de lengte van de IV, de key en de lengte van de ontsleutelde string, echter de string is niet juist ontsleuteld en is onleesbaar.
Iemand die nog een suggestie heeft?
Edit: Ontsleutelen binnen PHP gaat wel goed
Bookmarks