Pregunta

No sé mucho acerca de cifrado, pero yo era capaz de conseguir AES de trabajo en PHP ... un poco. Aquí hay un par de funciones que estoy usando:

function aes_decrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode = MCRYPT_MODE_ECB; 
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND) ); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
} 

function aes_encrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode=MCRYPT_MODE_ECB; 
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND)); 
} 

Estos son ligeramente modificada de una en la página de documentación de PHP para mcrypt . (Pasé de dev_urandom a rand, ya que estoy en la caja de una ventana, donde dev_urandom no está disponible.)

De todos modos el uso tecla I en estas funciones se define así:

define("PSK", pack("H*", "abcd7b5ca46e12345678a8161fdacee9"));

Me llamo mi función como esta:

echo bin2hex(aes_encrypt("wootwootwootwootwootwootwoo", PSK));

Ahora, los primeros 16 bytes (32 dígitos) de la cadena hexadecimal resultante son bien. Los siguientes 16 bytes no coinciden con lo que se espera.

He aquí, yo estoy publicando estos datos a un servicio web externo que se descifra. I (por desgracia) no puedo dar el caso de que una prueba de que tengo sin la entrega de la clave de cifrado y datos. Me siento mucho acerca de eso, pero estoy esperando que alguien familiarizado con mcrypt puede mirar esto y dime lo que estoy haciendo mal.

Una vez más, lo siento por la falta de un caso de prueba sólida, pero estoy muy agradecido de cualquier ayuda que puede dar!

EDIT: Parece que mi proveedor que estoy publicando a está utilizando un nulo IV. Siguiendo el consejo de Rook, he cambiado al modo CBC, y eliminado el código innecesaria relacionada con la tecla. Aquí están mis nuevas funciones:

function aes_decrypt($val,$key)
{
    $mode = MCRYPT_MODE_CBC;
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, null); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
}

function aes_encrypt($val,$key) 
{
    $mode = MCRYPT_MODE_CBC;
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, null); 
}
¿Fue útil?

Solución

Es probable que este servicio de cifrado se utiliza un modo de cifrado de bloques de funcionamiento diferente, como CBC. Si un iv nula está siendo utilizado con el modo CBC entonces el primer bloque (en este caso 16 bytes) de ECB y CBC producirá el mismo texto cifrado. modo ECB nunca debe ser utilizado por cualquier persona por cualquier razón.

Aquí es un mensaje cifrado modo de ejemplo BCE:

text alt

Otros consejos

Me y un colegio de mina donde la codificación de una aplicación para el iPhone y donde el uso de los métodos anteriores para cifrar y descifrar los datos. Pero nos encontramos con un problema cuando yo estaba cifrado de los datos a leer desde su iPhone. El iPhone utiliza el relleno PKCS7. El código anterior se agregó carnes de más esto haría que el método de descifrado iPhone falle. Modificamos el código para solucionar el problema actual:

public static function  aes128Encrypt($key,$val) 
{
    $mode = MCRYPT_MODE_CBC;
    $enc=MCRYPT_RIJNDAEL_128; 
    $blocksize= mcrypt_get_block_size($enc,$mode);
    $stringLength = strlen($val);
    $paddingLength =$blocksize-($stringLength%$blocksize);
    $val=str_pad($val,$paddingLength+$stringLength,chr($paddingLength));
    return base64_encode(mcrypt_encrypt($enc, $key, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")); 
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top