openssl_encrypt против mcrypt_encrypt

Я должен выполнить шифрование AES 128 в режиме CBC и сопоставить его с тем же шифрованием AES в coldfusion.

Вот мой код на PHP:

function pkcs5_pad($text, $blocksize) {
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}

$key = "vRJ6XSUi7OGebUK+n1vKkA==";
$iv = "AF9iPTpJC+zEa2auUxuloQ==";
$data = $this->pkcs5_pad("Message to encrypt", 16);
echo openssl_encrypt($data, 'aes-128-cbc', $key, 0, base64_decode($iv));
echo "<br>";
echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, base64_decode($iv)));

mcrypt_encrypt устарел, но дает тот же совместимый результат, что и в coldfusion: qLz13+xk19lZjSbfs92Ze5akuDbWOsNF2rYZN7aaEHc=, но openssl_encrypt дает мне другое значение: dnEcUy2tmvLZhZclnEwRpYHEbHajzmkpwbPorfNw5eN4d37MadEiPGLPvNAZmW4Q

Как я могу заставить openssl_encrypt давать то же значение, что и mcrypt_encrypt? Разве это не должно быть заменой для него?


person oussama kamal    schedule 18.08.2017    source источник


Ответы (1)


Две проблемы:

  1. Вы не декодируете ключ в Base64, поэтому вы передаете 24-байтовый (= 192-битный) ключ как openssl_encrypt, так и mcrypt_encrypt. Судя по всему, эти функции интерпретируют такой ключ по-разному! base64_decode ключ сначала для стабильных результатов.

    В качестве альтернативы, если вы действительно хотите использовать строку в кодировке Base64 в качестве 192-битного ключа, передайте 'aes-192-cbc' в качестве метода openssl_encrypt(). Это то, что mcrypt делает здесь. (Это не то же самое, что если бы вы передали MCRYPT_RIJNDAEL_192 в качестве шифра — это изменяет размер блока, а не размер ключа!)

  2. openssl_encrypt автоматически использует заполнение PKCS5. Заполнение данных перед их передачей этой функции приводит к тому, что данные заполняются дважды, оставляя их на один блок длиннее, чем предполагалось.

После устранения этих проблем обе функции теперь дают одинаковый результат.

person Community    schedule 18.08.2017
comment
Нет-нет, суть моего вопроса не в этом, если я буду следовать тому, что вы объяснили, я действительно получу тот же результат, но теперь он отличается от результата, который я получаю от AES при холодном синтезе. mcrypt_encrypt давал результат, мне нужен тот, который соответствует, и мне нужно, чтобы openssl дал тот же самый qLz13+xk19lZjSbfs92Ze5akuDbWOsNF2rYZN7aaEHc= как mcrypt_encrypt - person oussama kamal; 18.08.2017
comment
@oussamakamal Добавил примечание об этом. Я воспроизвел этот вывод с ключом в кодировке Base64 под aes-192-cbc. - person ; 18.08.2017