2017-04-21 1 views
1

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.

Répondre

2

MCRYPT_RIJNDAEL_256 n'est pas AES-256. C'est le chiffrement de Rijndael avec une taille de bloc de 256 (d'où l'erreur). AES est un sous-ensemble du chiffrement Rijndael utilisant la taille de bloc 128 et la clé tailles de 128, 192 et 256 bits. Ceci est également reflété dans la taille IV.

Pour créer un texte chiffré chiffré AES-256, vous pouvez utiliser MCRYPT_RIJNDAEL_128 avec la taille de clé correcte (256 bits est 32 octets).


Attention, mcrypt - en particulier la bibliothèque C sous-jacente - n'est plus maintenue. Il vaut mieux utiliser les librairies openssl ou ultérieures.