Desde Mcrypt es obsoleto, quiero usar OpenSSL lugar en mi código ya que el uso de php 7.0.17 en nuestro servidor y no se diga cuando se actualice.

Alguna tercera parte de la API (alojado en PHP 5.x probablemente y el uso de mcrypt), es tomar los datos cifrados. Ellos han proporcionado los métodos que se utilizan para cifrar/descifrar cadenas.

Aquí están los

$secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c' ;

public function encrypt128($str)
    {
        $block = mcrypt_get_block_size("rijndael_128", "ecb");
        $pad   = $block - (strlen($str) % $block);
        $str .= str_repeat(chr($pad), $pad);

        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB));
    }

public function decrypt128($str)
    {
        $str = base64_decode($str);
        $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB);

        $len = strlen($str);
        $pad = ord($str[$len - 1]);

        return substr($str, 0, strlen($str) - $pad);
    }

el uso de estos métodos cadena small1 si el cifrado se convierte en v7IXp5vVaFVXXlt/MN8BVw==


Queremos usar openssl_encrypt en nuestro lado de manera tal que si codificamos la misma cadena con OpenSSL se debe dar a los mismos resultados que Mcrypt. Yo he investigado que mcrypt utilizando rijndael-128 Modo bce debe ser compatible con OpenSSL aes-128-ecb.

Para el último par de horas, he estado tratando de hacer mi propio método para cifrar las cadenas de servir mismo resultado mediante el uso de OpenSSL. Hasta ahora he venido a esta

public function sslEncrypt128($str)
{
    $secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c';
    return base64_encode(openssl_encrypt($str, 'aes-128-ecb', $secret, OPENSSL_RAW_DATA));
}

Pero produce diferentes de la cadena de SxJ3+EdaeItZx3/EwGTUbw== por igual a la anterior entrada. No sé si es la bandera del problema o de relleno, de alguna sugerencia será bienvenida.

He añadido el código aquí para la prueba en línea https://3v4l.org/v2J2N

Gracias de antemano.

3 Comentarios

  1. 5

    Específicas de su ejemplo, me he encontrado con que al cambiar aes-128-ecb a aes-256-ecb, produce el mismo resultado que el legado mcrypt_encrypt.

    • Creo Mcrypt proporciona tamaños de bloque de 128, 192 y 256 bits. AES sólo proporciona el tamaño de bloque de 128. Mi conjetura es, MCRYPT_RIJNDAEL_128 es probablemente refiriéndose a Rijndael de 128 bits tamaño de bloque, que es AES. El tamaño de la clave es una cuestión diferente, y eso es lo que el 256 denota en OpenSSL AES-256-CBC. Si se utiliza un Estándar de cifrado Algoritmo de Nombre (SCAN), entonces el Mcrypt nombre de algoritmo para el cifrado ejemplo sería similar a Rijndael-128(256)/CBC.
  2. 3

    Aquí es lo que funcionó para mí:

    <?php
    
    $str = 'Content';
    if (strlen($str) % 16) {
        $str = str_pad($str, strlen($str) + 16 - strlen($str) % 16, "
    <?php
    $str = 'Content';
    if (strlen($str) % 16) {
    $str = str_pad($str, strlen($str) + 16 - strlen($str) % 16, "\0");
    }
    $key = 'KEY';
    if (strlen($key) % 16) {
    $key = str_pad($key, strlen($key) + 16 - strlen($key) % 16, "\0");
    }
    $res1 = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
    echo strToHex($res1) . ' | mcrypt_encrypt';
    echo "<hr>";
    echo strToHex(openssl_decrypt($res1, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt';
    echo "<hr>";
    $res2 = openssl_encrypt($str, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
    echo strToHex($res2) . ' | openssl_encrypt';
    echo "<hr>";
    echo strToHex(openssl_decrypt($res2, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt';
    function strToHex($string) {
    $hex = '';
    for ($i = 0; $i < strlen($string); $i++) {
    $ord     = ord($string[$i]);
    $hexCode = dechex($ord);
    $hex     .= substr('0' . $hexCode, -2);
    }
    return strToUpper($hex);
    }
    "
    ); } $key = 'KEY'; if (strlen($key) % 16) { $key = str_pad($key, strlen($key) + 16 - strlen($key) % 16, "
    <?php
    $str = 'Content';
    if (strlen($str) % 16) {
    $str = str_pad($str, strlen($str) + 16 - strlen($str) % 16, "\0");
    }
    $key = 'KEY';
    if (strlen($key) % 16) {
    $key = str_pad($key, strlen($key) + 16 - strlen($key) % 16, "\0");
    }
    $res1 = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
    echo strToHex($res1) . ' | mcrypt_encrypt';
    echo "<hr>";
    echo strToHex(openssl_decrypt($res1, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt';
    echo "<hr>";
    $res2 = openssl_encrypt($str, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
    echo strToHex($res2) . ' | openssl_encrypt';
    echo "<hr>";
    echo strToHex(openssl_decrypt($res2, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt';
    function strToHex($string) {
    $hex = '';
    for ($i = 0; $i < strlen($string); $i++) {
    $ord     = ord($string[$i]);
    $hexCode = dechex($ord);
    $hex     .= substr('0' . $hexCode, -2);
    }
    return strToUpper($hex);
    }
    "
    ); } $res1 = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB); echo strToHex($res1) . ' | mcrypt_encrypt'; echo "<hr>"; echo strToHex(openssl_decrypt($res1, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt'; echo "<hr>"; $res2 = openssl_encrypt($str, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING); echo strToHex($res2) . ' | openssl_encrypt'; echo "<hr>"; echo strToHex(openssl_decrypt($res2, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt'; function strToHex($string) { $hex = ''; for ($i = 0; $i < strlen($string); $i++) { $ord = ord($string[$i]); $hexCode = dechex($ord); $hex .= substr('0' . $hexCode, -2); } return strToUpper($hex); }
    • tio gracias! el relleno de los datos & key hizo coincidir exactamente lo que yo estaba recibiendo de la mcrypt manera.
  3. 2

    Más probable es que la clave estaba en espera de ser utilizado como hex (que ya lo es en formato hexadecimal) y no como una cadena que se convierte a hexadecimal.


    mcrypt:

    mcrypt no admite el estándar PKCS#7 (née PKCS#5) de relleno, sólo no estándar null relleno pero el relleno se agrega explícitamente antes de mcrypt.

    El cifrado v7IXp5vVaFVXXlt/MN8BVw== es la correcta cifrado basado en relleno PKCS#7. Modo ECB y la clave como una cadena.

    Ver: mcrypt – AES CALCULADORA.

    En hexadecimal, observe los datos de relleno es claramente visible:

    key: 6130613765373939376236643566636435356634623563333236313162383763

    data: 736D616C6C310A0A0A0A0A0A0A0A0A0A

    encrypted: BFB217A79BD56855575E5B7F30DF0157

    En Base64:

    encrypted: v7IXp5vVaFVXXlt/MN8BVw==


    OpenSSL:

    Aviso de la clave es de 256-bits, pero el OpenSSL llamada con «aes-128-bce» parece implicar un 128 -, pero la clave. Así que las claves no coinciden.

    Ver: OpenSSL – AES CALCULADORA

    En hexadecimal, observe los datos de relleno es claramente visible:

    key: 61306137653739393762366435666364

    data: 736D616C6C310A0A0A0A0A0A0A0A0A0A

    encrypted: 4B1277F8475A788B59C77FC4C064D46F

    En Base64:

    encrypted: SxJ3+EdaeItZx3/EwGTUbw==

Dejar respuesta

Please enter your comment!
Please enter your name here