elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Seguridad
| | |-+  Criptografía (Moderador: kub0x)
| | | |-+  [SOLUCIONADO] aes decrypt php
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SOLUCIONADO] aes decrypt php  (Leído 4,454 veces)
matake

Desconectado Desconectado

Mensajes: 23


Ver Perfil
[SOLUCIONADO] aes decrypt php
« en: 26 Julio 2016, 09:46 am »

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
  1. var texto_plano = "texto plano";
  2. var passphrase = "clave secreta";
  3. var salt = CryptoJS.lib.WordArray.random(16);
  4. var iv = CryptoJS.lib.WordArray.random(16);
  5. var key = CryptoJS.PBKDF2(passphrase, salt, { hasher: CryptoJS.algo.SHA512, keySize: 4, iterations: 1 });
  6. var encripted = CryptoJS.AES.encrypt(texto_plano, key, {iv: iv});
  7.  
  8. var cp = {};
  9. cp.ct = CryptoJS.enc.Base64.stringify(encripted.ciphertext);
  10. cp.s = CryptoJS.enc.Hex.stringify(salt);
  11. cp.iv = CryptoJS.enc.Hex.stringify(iv);
  12. cp = JSON.stringify(cp);
  13.  

y en php: EDITADO PARA SER MAS CLARO

Código
  1. $passphrase = "clave secreta";
  2. $ct = base64_decode("UCWtekP0i5nAKf+xWOMdbA==");
  3. $salt = hex2bin("663b7713dffd2c32583c55cad92746bc");
  4. $iv = hex2bin("ac344b6013bbaa84e001d3324521e10d");
  5.  
  6. $key = hash_pbkdf2("sha512", $passphrase, $salt, 1, 32);
  7. $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ct, MCRYPT_MODE_CBC, $iv);
  8.  
  9. $js_key = "ad5db505d7f47a223181388d90d511ff";//solo para comprobar si son iguales
  10.  
  11. echo "$js_key <-> $key <br>$data ";
  12.  

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
  1. $decrypted = mdecrypt_generic($td, base64_decode($enc_auth_token));
  2. $dec_s = strlen($decrypted);
  3. $padding = ord($decrypted[$dec_s-1]);
  4. $decrypted = substr($decrypted, 0, -$padding);
  5.  

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
  1. $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
 


« Última modificación: 26 Julio 2016, 18:02 pm por matake » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Api Guide Encrypt/Decrypt problemas!!
Programación Visual Basic
Hole_System 4 3,833 Último mensaje 27 Diciembre 2008, 01:38 am
por Hole_System
Nuevo Efecto Encrypt-Decrypt By Guerrerohgp
Scripting
Guerrerohgp 0 2,473 Último mensaje 22 Agosto 2009, 20:55 pm
por Guerrerohgp
Decrypt UDF2 Hash
Hacking
Chiphop.- 1 3,102 Último mensaje 9 Febrero 2013, 07:09 am
por vishalverma
Ayuda (Encrypt\Decrypt)
Criptografía
benyy 0 2,989 Último mensaje 10 Marzo 2013, 12:31 pm
por benyy
Decrypt
Foro Libre
TEKILA 1 1,651 Último mensaje 2 Septiembre 2017, 17:31 pm
por AlbertoBSD
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines