openssl_encrypt openssl_decrypt encrypt decrypt php encryption coldfusion aes pkcs#5

php - openssl_decrypt - openssl_encrypt



Descifrado de PHP AES devuelve relleno al frente de la cadena? (1)

(De los comentarios ...)

El modo CBC requiere un iv . "El descifrado con la IV incorrecta causa que el primer bloque de texto sin formato esté dañado ... ". Intenta usar el mismo iv en ambos lados

He estado luchando por descifrar una cadena determinada, generada por un servidor remoto ColdFusion, en PHP usando AES en modo CBC con relleno PKCS5. He llegado al punto en que puedo descifrar la cuerda casi a la perfección, el problema es que parece que hay algo sucio al principio de la cuerda. Pensé que el relleno se produjo al final, pero mirando la cadena desencriptada, al final no hay nada, pero el comienzo está relleno, por lo que la cadena tiene 64 caracteres (la cadena original tiene 32 caracteres). Intenté cambiar mi relleno código de eliminación para mirar al principio en lugar de al final, pero esos caracteres no proporcionan ninguna información que pueda usar para descifrar cuánto relleno eliminar, por lo que creo que provienen de otro lado. Aquí está mi código hasta ahora

function decrypt($hash) { $enc_key = "Oq2vh+gswPn2CRPccODtKg=="; $cipher = "rijndael-128"; $str = mcrypt_decrypt($cipher, base64_decode($enc_key), base64_decode($hash), MCRYPT_MODE_CBC); $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $pad = ord($str[($len = strlen($str)) - 1]); $len = strlen($str); $decrypted = substr($str, 0, strlen($str) - $pad); if($decrypted != NULL) { $params = explode (''|'', $decrypted); } return (object)array( ''input'' => $hash, ''pad'' => $pad, ''len'' => $len, ''blocksize'' => $block, ''aes_key'' => $enc_key, ''cipher'' => $cipher, ''result'' => $params, ''decrypted'' => $decrypted, ''padded'' => $str );

Si encripto la cadena (usando ColdFusion, el algoritmo '''' AES / CBC / PKCS5Padding '''' y la codificación base64):

"[email protected]|test|1400863515"

Obtengo la cadena encriptada:

QRO04vmtw76Qvl0hscmYZ/SFGNv/8d88H9kT60JA5IJdg/KMT7udrn2IZuQzkOPvLjXoc4novzTMGsk0CMxjvg==

y cuando ejecuto esto a través de la función PHP anterior, obtengo esto como salida:

¹¾Sò''->äe¿fÏäJ±[email protected]|test|1400863515

¿Cuáles son esos personajes al principio? ¿Por qué no hay relleno al final? He leído docenas de publicaciones en SO y en otros lugares (que es cómo llegué hasta aquí), pero esta última pieza me hace rascar la cabeza.