J'ai un problème de décryptage des données dans pgcrypto qui a été précédemment crypté dans l'application PHP.Impossible de déchiffrer en utilisant pgcrypto à partir d'AES-256-CBC mais AES-128-CBC est OK
J'ai essayé 3 types de cryptage:
1) mcrypt - Rijndael 128 CBC
2) mcrypt - Rijndael 256 CBC
3) openssl_encrypt - aes-256-cbc
tout est crypté déchiffré bien en PHP, mais pgcrypto je peux déchiffrer à l'aide même clé et iv seulement 1) mcrypt - Rijndael 128 CBC
Voici un exemple de code pour une partie de PHP:
<?php
function d ($data, $key, $mode) {
$data = @base64_decode($data);
$pad = $mode == MCRYPT_RIJNDAEL_256 ? 32 : 16;
$iv = mb_substr($data, 0, $pad, "8bit");
$data = mb_substr($data, $pad, mb_strlen($data, "8bit"), "8bit");
if ($data === null || $data === "") {
return $data;
}
if ($mode == MCRYPT_RIJNDAEL_128 OR $mode == MCRYPT_RIJNDAEL_256) {
$data = mcrypt_decrypt($mode, $key, $data, MCRYPT_MODE_CBC, $iv);
} else {
$data = openssl_decrypt($data, "aes-256-cbc", $key, 0, $iv);
}
if ($data === false) {
throw new Exception("Unable to decrypt data");
}
$padding = ord($data[mb_strlen($data, "8bit") - 1]);
$data = mb_substr($data, 0, mb_strlen($data, "8bit") - $padding, "8bit");
return $data;
}
function e ($data, $key, $mode) {
$pad = $mode == MCRYPT_RIJNDAEL_256 ? 32 : 16;
$iv = openssl_random_pseudo_bytes($pad);
$padding = 16 - (strlen($data) % $pad);
$data .= str_repeat(chr($padding), $padding);
if ($mode == MCRYPT_RIJNDAEL_128 OR $mode == MCRYPT_RIJNDAEL_256) {
$data = mcrypt_encrypt($mode, $key, $data, MCRYPT_MODE_CBC, $iv);
} else {
$data = openssl_encrypt($data, "aes-256-cbc", $key, 0, $iv);
}
if ($data === false) {
throw new Exception("Unable to encrypt data");
}
return base64_encode($iv . $data);
}
$mode1 = MCRYPT_RIJNDAEL_128;
$key1 = "67pma7BQL01cqb6Nlil2T1436lLXv8Ln";
$key2 = "85f2669023b98a62d1312af75994ddf1";
$mode2 = MCRYPT_RIJNDAEL_256;
$key3 = "85f2669023b98a62d1312af75994ddf1";
$mode3 = "aes-256-cbc";
$data = "test";
$e1 = e($data, $key1, $mode1);
$e2 = e($data, $key2, $mode2);
$e3 = e($data, $key3, $mode3);
$d1 = d($e1, $key1, $mode1); //
$d2 = d($e2, $key2, $mode2); //
$d3 = d($e3, $key3, $mode3); //
//for ($i=1; $i < 4; $i++) {
// ${"e" . $i} = e($data, ${"key" . $i}, ${"mode" . $i});
//
// ${"d" . $i} = d(${"e" . $i}, ${"key" . $i}, ${"mode" . $i});
//}
Les résultats et données utilisées pour le code:
1) mcrypt - Rijndael 128 CBC
- key = "67pma7BQL01cqb6Nlil2T1436lLXv8Ln"
- vecteur d'initialisation base64 = "q5gXIfW6maT4zx4tgJQImg =="
- chaîne cryptée base64 = "q5gXIfW6maT4zx4tgJQImtwJgEVK66mTcRPdilkEiHY ="
- chaîne décryptée base64 = "dGVzdA =="
2) mcrypt - Rijndael 256 CBC
- key = "85f2669023b98a62d1312af75994ddf1"
- vecteur d'initialisation base64 = « 2EmtyH ++ cQA5X5mmtY + vpl5FkVwELS9ExrYnFjGGco0 = »
- chaîne cryptée base64 = "2EmtyH ++ cQA5X5mmtY + vpl5FkVwELS9ExrYnFjGGco3B29CC5DpfWs1YAfh8WuY9f0/6OPC1B4sidSV5TojJ1g =="
- chaîne décryptée base64 = "dGVzdAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAA ="
3) openssl_encrypt - aes-256-cbc
- key = "85f2669023b98a62d1312af75994ddf1"
- vecteur d'initialisation base64 = « Toi + xXZf6MyPDpQzPZAI6Q = = »
- chaîne cryptée base64 = "+ TØI xXZf6MyPDpQzPZAI6XJQYmwyNUVzKzdaVnNickc5dEg5MUd1anpBYlpLeW9SQjhpZ29yQzRpWFk9"
- chaîne décryptée base64 = « dGVzdA == »
Voici comment je suis en train de déchiffrer ces données Postgres utilisant les mêmes touches et IV.
SELECT
-- mcrypt aes 128
decrypt_iv(
decode('q5gXIfW6maT4zx4tgJQImtwJgEVK66mTcRPdilkEiHY=', 'base64'),
'67pma7BQL01cqb6Nlil2T1436lLXv8Ln',
decode('q5gXIfW6maT4zx4tgJQImg==', 'base64'),
'aes-cbc'
),
-- mcrypt aes 256
decrypt_iv(
decode('2EmtyH++cQA5X5mmtY+vpl5FkVwELS9ExrYnFjGGco3B29CC5DpfWs1YAfh8WuY9f0/6OPC1B4sidSV5TojJ1g==', 'base64'),
'85f2669023b98a62d1312af75994ddf1',
decode('2EmtyH++cQA5X5mmtY+vpl5FkVwELS9ExrYnFjGGco0=', 'base64'),
'aes-cbc'
),
-- -- openssl aes 256
-- decrypt_iv(
-- decode('tOi+xXZf6MyPDpQzPZAI6XJQYmwyNUVzKzdaVnNickc5dEg5MUd1anpBYlpLeW9SQjhpZ29yQzRpWFk9', 'base64'),
-- '85f2669023b98a62d1312af75994ddf1',
-- decode('tOi+xXZf6MyPDpQzPZAI6Q==', 'base64'),
-- 'aes-cbc'
--),
-- pgcrypto same values as mcrypt aes 128 encrypt then decrypt
decrypt_iv(
encrypt_iv(
'test',
'67pma7BQL01cqb6Nlil2T1436lLXv8Ln',
decode('q5gXIfW6maT4zx4tgJQImg==', 'base64'),
'aes-cbc'),
'67pma7BQL01cqb6Nlil2T1436lLXv8Ln',
decode('q5gXIfW6maT4zx4tgJQImg==', 'base64'),
'aes-cbc'
)
Comme vous le voyez tous les 3 déchiffré OK en PHP. Dans Postgres seulement le premier (mcrypt aes128cbc) décrypté OK - les 16 premiers octets sont toujours IV, mais je pourrais les supprimer et les convertir en texte. Deux autres (mcrypte AES256CBC et openssl256cbc) n'ont même pas l'air d'avoir été décryptés. J'ai commenté bloc avec openssl256cbc car il me donne "[39000] ERREUR: erreur decrypt_iv: Données pas un multiple de taille de bloc" erreur.
Toute aide sera appréciée.