with example encrypt decrypt data cbc php asp.net encryption mcrypt rijndael

php - example - Descifrar la cookie.ASPXAUTH WITH protection=validation



php aes encryption example (3)

Sé lo doloroso que es descifrar en PHP algo cifrado en .NET y viceversa.

Tuve que terminar codificándome el algoritmo Rijndael (lo traduje de otro idioma).

Aquí está el enlace al código fuente del algoritmo: http://pastebin.com/EnCJBLSY

Al final del código fuente hay algún ejemplo de uso.

Pero en .NET, debe usar relleno cero al encriptar. También probarlo con el modo ECB, no estoy seguro de si CBC funciona.

Buena suerte y espero que ayude

editar: el algoritmo devuelve la cadena hexadecimal cuando cifra, y también espera cadena hexadecimal al descifrar.

Durante bastante tiempo he intentado descifrar la cookie ASP .ASPXAUTH y descifrarla usando PHP. Mis razones son enormes y necesito hacer esto, no hay alternativa. Hasta ahora, en PHP he logrado leer los datos de esta cookie, pero parece que no puedo hacerlo mientras está encriptada. De todos modos, aquí va ...

En primer lugar, debe modificar el archivo Web.config de su servidor (la protección debe establecerse en Validación):

<authentication mode="None"> <forms name=".ASPXAUTH" protection="Validation" cookieless="UseCookies" timeout="10080" enableCrossAppRedirects="true"/> </authentication>

Luego, en un script PHP en el mismo dominio, puede hacer lo siguiente para leer los datos, este es un ejemplo muy básico, pero es una prueba:

$authCookie = $_COOKIE[''_ASPXAUTH'']; echo ''ASPXAUTH: ''.$authCookie.''<br />''."/n";//This outputs your plaintext hex cookie $packed = pack("H*",$authCookie); $packed_exp = explode("/0",$packed);//This will separate your data using NULL $random_bytes = array_shift($packed_exp);//This will shift off the random bytes echo print_r($packed_exp,TRUE); //This will return your cookies data without the random bytes

Esto desglosa la cookie, o al menos los datos no cifrados:

Ahora que sé que puedo obtener los datos, eliminé la cadena ''protection ='' validation '''' de mi Web.config e intenté descifrarla usando PHP mcrypt. He intentado innumerables métodos, pero aquí hay un ejemplo prometedor (que falla) ...

define(''ASP_DECRYPT_KEY'',''0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8'');//This is a decryption key found in my Machine.config file (please note this is forged for example) $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_RAND); $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, ASP_DECRYPT_KEY, $authCookie, MCRYPT_MODE_CBC, $iv);//$authCookie is the pack()''d cookie data

Sin embargo, esto falla. Probé variaciones de IV con todos los ceros a 16 bytes. Probé diferentes tamaños de Rijndael (128 frente a 256). He intentado con base64_decode () ing, nada parece funcionar. Encontré esta publicación stackoverflow aquí y comencé a usar variaciones de la clave / iv que se hacen con sha256, pero eso tampoco funciona.

¿Alguien tiene una pista de lo que debería hacer?


No sé cómo se hace el cifrado en .NET AuthCookies, pero puedo intentar responder.

Suponiendo que el cifrado se produce en el modo AES CBC-IV, con IV generados aleatoriamente, primero debe averiguar dónde está el IV.

El fragmento de código que muestra no puede funcionar, ya que está generando un IV aleatorio (que será incorrecto). Dicho esto, incluso si obtienes el IV incorrecto, en modo CBC solo tendrás los primeros 16 bytes de tu texto cifrado descifrado "distorsionados" y el resto se descifrará correctamente. Puedes usar esto como prueba para saber si eres haciendo el resto correctamente En la práctica, cuando se utilizan IV aleatorios, es muy probable que esté antepuesto al texto cifrado. Para comprobar si esto es correcto, puede intentar verificar si len (texto cifrado) = len (texto plano) + 16. Esto significa que lo más probable es que los primeros 16 bytes sean su IV (y por lo tanto, debe eliminarse del texto cifrado antes de intentar descifrarlo).

También en su fragmento de código, parece que está utilizando la clave como una cadena de caracteres, mientras que debería ser una matriz de bytes. Tratar:

define(''ASP_DECRYPT_KEY'',hex2bin(''0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8''));

Además, parece ser una clave de 32 bytes, por lo que debe usar AES-256. No sé cómo se ve el authcookie, pero si está codificado en base64, también es necesario decodificarlo primero, obviamente.

¡Espero que esto ayude!

Nota: No recomiendo hacer esto para código de producción importante, sin embargo, porque hay muchas cosas que pueden salir mal si intenta implementar incluso su propia rutina de descifrado como lo hace aquí. En particular, supongo que debería haber una etiqueta MAC en alguna parte que deba verificar antes de intentar el descifrado, pero hay muchas otras cosas que pueden salir mal al implementar su propia criptografía.


Entiendo que esto puede no haber sido posible para el OP, pero para otras personas que se dirigen hacia abajo en esta ruta aquí hay una alternativa simple.

  1. Crea un servicio web .net con un método como:

    public FormsAuthenticationTicket DecryptFormsAuthCookie (ticket de cadena)
    {
    devuelve FormsAuthentication.Decrypt (ticket);
    }

  2. Pase la cookie al servicio web desde PHP:

    $ authCookie = $ _COOKIE [''. ASPXAUTH''];
    $ soapClient = new SoapClient ("http: // localhost /Service1.svc?wsdl");
    $ params = array (
    "boleto" => $ authCookie
    );
    $ result = $ soapClient-> DecryptFormsAuthCookie ($ params);