[SOLUCIONADO] aes decrypt php

Iniciado por matake, 26 Julio 2016, 09:46 AM

0 Miembros y 1 Visitante están viendo este tema.

matake

Hola,

Hace unos dias @kub0x me ayudo a entender ciertas cosas ( que desconocia sobre el cifrado ). El asunto era sobre CryptoJS AES  http://foro.elhacker.net/criptografia/dudas_con_iv_y_salt-t455043.0.html

En javascript hice las modificaciones que me aconsejo @kub0x es decir :

 - salt y IV aleatorios
 - generar una key en base al dicho salt y my passphrase con pbkdf2
 - cifrado AES CBC padding: Pkcs7
 - hmac para el control de integridad
 - convertidos a json chiper_text IV y salt y enviarlos al servidor

En PHP
 - descodificar json con json_decode()
 - pasar el salt y el IV por hex2bin()
 - regenerar la key con hash_pbkdf2()

y aquy me he quedado atascado. (por lo menos he comprobado que la key regenerada cpn hash_pbkdf2() en PHP es la misma que tenia en javascript )

El ejemplo menos seguro que tenia empleaba openssl_decrypt() para descifrar y despues de mucho darle la vuelta vi que openssl no accepta key-s hechas con pbkdf2

he intentado con mcrypt_decrypt(); y no me funciono ... tampoco se cual seria la equivalencia del Pkcs7 para mcrypt_decrypt() ya que este tiene MCRYPT_RIJNDAEL_128
he intentado tambien con MCRYPT_RIJNDAEL_256

En js tengo esto
Código (javascript) [Seleccionar]

var texto_plano = "texto plano";
var passphrase = "clave secreta";
var salt = CryptoJS.lib.WordArray.random(16);
var iv = CryptoJS.lib.WordArray.random(16);
var key = CryptoJS.PBKDF2(passphrase, salt, { hasher: CryptoJS.algo.SHA512, keySize: 4, iterations: 1 });
var encripted = CryptoJS.AES.encrypt(texto_plano, key, {iv: iv});

var cp = {};
cp.ct = CryptoJS.enc.Base64.stringify(encripted.ciphertext);
cp.s = CryptoJS.enc.Hex.stringify(salt);
cp.iv = CryptoJS.enc.Hex.stringify(iv);
cp = JSON.stringify(cp);


y en php: EDITADO PARA SER MAS CLARO

Código (php) [Seleccionar]

$passphrase = "clave secreta";
$ct = base64_decode("UCWtekP0i5nAKf+xWOMdbA==");
$salt = hex2bin("663b7713dffd2c32583c55cad92746bc");
$iv = hex2bin("ac344b6013bbaa84e001d3324521e10d");

$key = hash_pbkdf2("sha512", $passphrase, $salt, 1, 32);
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ct, MCRYPT_MODE_CBC, $iv);

$js_key = "ad5db505d7f47a223181388d90d511ff";//solo para comprobar si son iguales

echo "$js_key <-> $key <br>$data ";


Despues de intentar mas y mas cosas he editado y he copiado lo que me generaba CryptoJS  para que quede mas claro:

Ahora mis dudas van por este camino:

1. ¿Es correcto usar en PHP hext2bin() para el IV? (ya que en el manual de PHP indica string para mcrypt_decrypt )

2. ¿Que algoritmo seria correcto MCRYPT_RIJNDAEL_128 o 256? ( segun he leydo por aquy seria 128 el equivalente para AES 256 )

3. ¿Como se puede resolver la diferencia del padding? ( en CryptoJS puse Pkcs7 ... dicen que es mas seguro ... pero MCRYPT emplea zeropadding)

Encontre en el manual de PHP esto pero no se como adaptarlo a mi situacion:
Código (php) [Seleccionar]

$decrypted = mdecrypt_generic($td, base64_decode($enc_auth_token));
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);
$decrypted = substr($decrypted, 0, -$padding);


Supongo por logica que el salt y el key generados por pbkdf2 son correctos ya que son iguales en js y en PHP


Gracias

[SOLUCIONADO] ultima edicion.

Al final lo resolvi con openssl_decrypt();
Código (php) [Seleccionar]
$data = openssl_decrypt($ct, 'aes-256-cbc', hex2bin($key), OPENSSL_RAW_DATA, $iv);

El error que hacia es que ponia la key como string y por esto no functionaba.

Tambien tuve que incrementar la longitud de clave a 64 ( o sea con los datos que puse  al principio no funciona ... tuve que generar otras).
No se si soporta mas grande de 64 (intentare ahora) ... incrementare tambien las iteraciones que deje solo 1 para las pruebas.

No se si alguien tiene otra solucion para mcrypt_decrypt() bienvenida sea pero yo lo marco como solucionado ya que es esto que buscaba descifrar de alguna manera en PHP.

Saludos