шифрование — Coldfusion 3DES encrypt отличает зашифрованный результат от PHP `mcrypt_encrypt`

Сначала Coldfusion Encrypt:

<cfset message = '1447841550'>
<cfset key = 'Mk9m98IfEblmPfrpsawt7BmxObt98Jev'>

<cfset ciphertext = Encrypt(#message#, #key#, "desede", "base64")>
<cfoutput>#ciphertext#</cfoutput>

Затем PHP mcrypt:

$message = "1447841550";
$key = 'Mk9m98IfEblmPfrpsawt7BmxObt98Jev';

$key = base64_decode($key);

$bytes = array(0,0,0,0,0,0,0,0); //byte [] IV = {0, 0, 0, 0, 0, 0, 0, 0}
$iv = implode(array_map("chr", $bytes));

$ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv);

echo base64_encode($ciphertext);

Проблема.

В той же строке, тот же алгоритм и та же кодировка.

Тем не менее, есть небольшая часть результатов, которые не совпадают.

Ниже приведен реальный пример вывода.

// Coldfusion output.

n6lp0I1w5FwrP3yPw3s8bw==

^^^^^^^^^^

Same part


// PHP output.

n6lp0I1w5FxLQHskKMn4sw==

^^^^^^^^^^

Same part

Почему Coldfusion дает разные результаты?

Как я мог получить те же результаты в Coldfusion при условии, что не изменяют код PHP.
Вывод PHP — правильный вывод для меня.

Можно ли получить правильный результат (PHP) с помощью JavaScript? Это решение тоже хорошо.

Я разочарован.

5

Решение

Настройки близки, но не совсем то же самое. Причина, по которой результаты отличаются, заключается в том, что:

  1. Режим «CBC» требует IV (вектор инициализации). Код PHP явно предоставляет IV, а код CF — нет. Итак encrypt() Функция генерирует IV случайно. Следовательно, почему результаты не совпадают: разные IV, разные результаты.

  2. При использовании режима «NoPadding» входная строка должна быть дополнена, чтобы ее длина была кратна размеру блока (т. Е. DESEDE => 8). Из того, что я понимаю, «… расширение PHP для mcrypt использует только ZeroPadding». CF encrypt() функция не поддерживает заполнение нулями. Тем не менее, вы можете смоделировать это, используя что-то вроде этого UDF nullPad ()

После того, как вы включите эти два (2) изменения, результаты будут соответствовать:

Результаты:

n6lp0I1w5FxLQHskKMn4sw==

Пример:

<cfset message = nullPad("1447841550", 8)>
<cfset key = "Mk9m98IfEblmPfrpsawt7BmxObt98Jev">
<!--- Important: IV values should be random, and NOT reused --->
<!--- https://en.wikipedia.org/wiki/Initialization_vector --->
<cfset iv = binaryDecode("0000000000000000", "hex")>
<cfset ciphertext = Encrypt(message, key, "DESede/CBC/NoPadding", "base64", iv)>
<cfoutput>#ciphertext#</cfoutput>
8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]