php - openssl_encrypt - openssl_zero_padding
El cifrado ColdFusion 3DES hace que el resultado cifrado sea diferente a PHP `mcrypt_encrypt` (1)
Al principio, Coldfusion Encrypt:
<cfset message = ''1447841550''>
<cfset key = ''Mk9m98IfEblmPfrpsawt7BmxObt98Jev''>
<cfset ciphertext = Encrypt(#message#, #key#, "desede", "base64")>
<cfoutput>#ciphertext#</cfoutput>
Entonces, 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);
Problema.
En la misma cadena, el mismo algoritmo y la misma codificación.
Todavía hay una pequeña parte de la salida que no coincide.
A continuación se muestra la salida de muestra real.
// Coldfusion output.
n6lp0I1w5FwrP3yPw3s8bw==
^^^^^^^^^^
Same part
// PHP output.
n6lp0I1w5FxLQHskKMn4sw==
^^^^^^^^^^
Same part
¿Por qué Coldfusion hace que los resultados sean diferentes?
Cómo podría obtener los mismos resultados en Coldfusion con la condición de que no modifique el código PHP. La salida de PHP es la salida correcta para mí.
¿Es posible obtener el resultado correcto (PHP) con javascript? Esta solución también es buena.
Estoy frustrado.
Gracias de antemano
La configuración está cerca, pero no exactamente igual. La razón por la que los resultados difieren es porque:
El modo "CBC" requiere un
IV
(vector de inicialización). El código PHP proporciona un IV explícitamente, pero el código CF no. Entonces, la funciónencrypt()
genera un IV al azar. De ahí que los resultados no coincidan: diferente IV, resultado diferente.Cuando utiliza el modo "NoPadding", la cadena de entrada debe estar acolchada de manera que su longitud sea un múltiplo par del tamaño del bloque (es decir, DESEDE => 8). Por lo que entiendo, "... la extensión mcrypt de PHP solo usa ZeroPadding" . La función CF
encrypt()
no admite el relleno cero. Sin embargo, puedes simularlo usando algo como esto udf nullPad ()
Una vez que haya incorporado esos dos (2) cambios, los resultados coincidirán:
Resultados:
n6lp0I1w5FxLQHskKMn4sw==
Ejemplo:
<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>