Pregunta

Estoy tratando de realizar el cifrado y el descifrado (Rijndael 256, modo ECB) en dos componentes diferentes:
1. PHP - el lado del servidor (usando mcrypt)
2. C + + - del lado del cliente (utilizando gcrypt)

me encontré con un problema cuando el cliente no podía descifrar correctamente los datos cifrados (hecho por el lado del servidor)
así que ... he comprobado el:
1. vector inicial - el mismo mismo (32 longitud)
2. la tecla - de nuevo la misma clave en ambos lados ..

Así que escribí algo de código en C ++ que cifrar los datos (con los mismos parámetros como en el php)
y me di cuenta de que los datos cifrados contiene diferentes bytes (tal vez la codificación tema ??)

Yo estaré más que contento de conseguir un poco de ayuda

PHP - MCrypt


// Encrypt Function
function mc_encrypt($encrypt, $mc_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $iv = "static_init_vector_static_init_v";
    echo "IV-Size: " . $iv_size . "\n";
    echo "IV: " . $iv . "\n";
    $passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, $encrypt, MCRYPT_MODE_ECB, $iv);
    print_hex($passcrypt);
    return $encode;
}

mc_encrypt("Some text which should be encrypted...","keykeykeykeykeykeykeykeykeykeyke");

voy a publicar el código C ++ en un comentario

Gracias, Johnny Depp

¿Fue útil?

Solución

OK. Voy a hacer mi comentario una respuesta:

Un vector de inicialización (IV) no se utiliza en modo ECB. Si se proporciona diferentes implementaciones pueden funcionar de forma diferente.

Si usted quiere estar seguro de las implementaciones funcionará correctamente a continuación, utilizar un IV de 0 (cero). A pesar de que se proporciona el IV, ambas implementaciones debe pasar por alto, pero uno nunca puede estar seguro de eso. Si no se proporciona una vía intravenosa en modo ECB debería funcionar aswell pero de nuevo, todo depende de las implementaciones.

De acuerdo con el PHP MCrypt se ignoralo. GCrypt No estoy seguro.

mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB) realidad debería devolver 0, ya que especifica el modo BCE.

Editar

No llame mcrypt_get_iv_size o mcrypt_create_iv.
En lugar llamar mcrypt_encrypt sin un IV. De acuerdo con el PHP documentación todos los bytes del IV se establecerán en '\ 0'.

Lo mismo va para el código C ++. No hay necesidad de configurar ningún IV en absoluto. El código libgcrypt es compleja, pero de echar un vistazo a la fuente de la versión 1.4.5 a continuación, en el modo ECB parece que el IV no se utiliza en absoluto.

Si el texto cifrado resultante todavía se diferencia entonces el problema es otra cosa.
Un par de posibilidades viene a la mente:

  • Codificación -? Es la misma codificación que se utiliza en el servidor y el cliente
  • Endianness - ¿Qué tipo de sistemas son el servidor y el cliente? Big-vs ascendente hacia la izquierda?
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top