Сначала 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? Это решение тоже хорошо.
Я разочарован.
Настройки близки, но не совсем то же самое. Причина, по которой результаты отличаются, заключается в том, что:
Режим «CBC» требует IV
(вектор инициализации). Код PHP явно предоставляет IV, а код CF — нет. Итак encrypt()
Функция генерирует IV случайно. Следовательно, почему результаты не совпадают: разные IV, разные результаты.
При использовании режима «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>
Других решений пока нет …