RedSys, mycrypt, openssl y servidor con PHP 7.1

Tratemos el error que surge con RedSys, mycrypt, openssl y servidor con PHP 7.1 o superior .Resulta que en ocasiones cuando actualizas el servidor y pasas a poner una versión de PHP más reciente, como por ejemplo la 7.1.X como es en uno de los casos que estamos tratanso, hay funciones que dejan de utilizarse (deprecated) como mycrypt y hay que utilizar otra opción como puede ser openssl_encrypt.

Dicho de otro modo, actualizo a PHP 7.1.X y la función que utilizaba antes para crear la encriptación 3DES necesaria para la pasarela de RedSys deja de funcionar, y por lo tanto, la pasarela RedSys que tenía dejar de funcionar. Fijaos la función que tenía anteriormente:

function encrypt_3DES($message, $key) {
  // Se establece un IV por defecto
  $bytes = array(0, 0, 0, 0, 0, 0, 0, 0);
  $iv = implode(array_map("chr", $bytes));
  // Se cifra
  $ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv);
  return $ciphertext;
}

Pues bien. La función mcrypt_encrypt en PHP 7.1.X no puede utilizarse y hay que optar por una nueva función: openssl_encrypt

Cómo quedaría la función que genera la encriptación 3DES para la psarela? utilizaremos la función openssl_encrypt con los siguientes parámetros:

function encrypt_3DES($message, $key) {
  $l = ceil(strlen($message) / 8) * 8;
  return substr(openssl_encrypt($message . str_repeat("\0", $l - strlen($message)), 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, "\0\0\0\0\0\0\0\0"), 0, $l);
}

Con esto, deberíamos tener solucionado el conflicto entre RedSys, mycrypt, openssl y servidor con PHP 7.1 o superior.

Está comprobado que funciona. Si queréis saber algo más al respecto, podéis visitar el siguiente enlace.

Más información

Como siempre os comento, si no estáis seguros o no sabéis qué estáis haciendo, no toquéis en servidores, y menos si están en producción. No me hago cargo de lo que pueda suceder. Si decidís seguir los pasos, es bajo vuestras responsabilidad y estando seguros de lo que están haciendo.

Espero que os haya sido de utilidad este artículo que pasa al listado de tutoriales de servidores web que tenemos en el blog.