c# php encryption decode mcrypt

Encriptación/descifrado multiplataforma(php a C#.NET) con Rijndael



encryption decode (1)

Aquí puedo ver problemas en ambos lados.

Tenga en cuenta que lo que se obtiene al codificar no es una cadena, sino una matriz de bytes. Por lo tanto, en PHP no es necesario codificar urlencode cyphertext.

La codificación base64 es todo lo que necesitas. Cuando abres base64_encode te ayudamos a ver

base64_encode Codifica los datos dados con base64. Esta codificación está diseñada para hacer que los datos binarios sobrevivan al transporte

Una cosa más: para que su mensaje sea decodificado en .net con la longitud correcta, debe agregarlo manualmente con caracteres de relleno. El modo de relleno predeterminado para RijndaelManaged es PKCS7, vamos a mantenerlo. Tiene que extender su cadena de origen a bloques iguales con código de caracteres igual al número de bytes de relleno.

<?php $iv = "45287112549354892144548565456541"; $key = "anjueolkdiwpoida"; $text = "This is my encrypted message"; // to append string with trailing characters as for PKCS7 padding scheme $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); $padding = $block - (strlen($text) % $block); $text .= str_repeat(chr($padding), $padding); $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $iv); // this is not needed here //$crypttext = urlencode($crypttext); $crypttext64=base64_encode($crypttext); print($crypttext64) . "/n<br/>"; ?>

En el lado C #, ha realizado la conversión de base64 a byte [] a string a byte [] . Debe realizar la primera conversión de base64 a byte [] solamente. Recuerde, base64 contiene el texto cifrado que es información binaria, no una cadena. También tenga en cuenta que RijndaelManaged es IDisposable, por lo que lo he envuelto en la construcción (). Llamar a Close () es necesario pero no es suficiente como se indica en MSDN.

public byte[] Decode(string str) { var decbuff = Convert.FromBase64String(str); return decbuff; } static public String DecryptRJ256(byte[] cypher, string KeyString, string IVString) { var sRet = ""; var encoding = new UTF8Encoding(); var Key = encoding.GetBytes(KeyString); var IV = encoding.GetBytes(IVString); using (var rj = new RijndaelManaged()) { try { rj.Padding = PaddingMode.PKCS7; rj.Mode = CipherMode.CBC; rj.KeySize = 256; rj.BlockSize = 256; rj.Key = Key; rj.IV = IV; var ms = new MemoryStream(cypher); using (var cs = new CryptoStream(ms, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Read)) { using (var sr = new StreamReader(cs)) { sRet = sr.ReadLine(); } } } finally { rj.Clear(); } } return sRet; }

Como resultado, el siguiente código en C # le devolverá la cadena inicial:

var iv = "45287112549354892144548565456541"; var key = "anjueolkdiwpoida"; var cypher = "u+rIlHB/2rrT/u/qFInnlEkg2unhizsNzGVb9O54sP8="; var temp = DecryptRJ256(Decode(cypher), key, iv);

Actualmente estoy teniendo un pequeño problema con el descifrado de un mensaje cifrado por php mcrypt. El código php es el siguiente:

<?php //$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); $iv = "45287112549354892144548565456541"; $key = "anjueolkdiwpoida"; $text = "This is my encrypted message"; $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $iv); $crypttext = urlencode($crypttext); $crypttext64=base64_encode($crypttext); print($crypttext64) . "/n<br/>"; ?>

El mensaje cifrado se envía a una plataforma ASP.NET (C #). Sin embargo, estoy teniendo problemas para mantener el orden de descifrado (base64 decodificación a urldecode). El código que tenía en ASP.NET es el siguiente (iv y la clave es la misma que en php):

public string Decode(string str) { byte[] decbuff = Convert.FromBase64String(str); return System.Text.Encoding.UTF8.GetString(decbuff); } static public String DecryptRJ256(string cypher, string KeyString, string IVString) { string sRet = ""; RijndaelManaged rj = new RijndaelManaged(); UTF8Encoding encoding = new UTF8Encoding(); try { //byte[] message = Convert.FromBase64String(cypher); byte[] message = encoding.GetBytes(cypher); byte[] Key = encoding.GetBytes(KeyString); byte[] IV = encoding.GetBytes(IVString); rj.Padding = PaddingMode.Zeros; rj.Mode = CipherMode.CBC; rj.KeySize = 256; rj.BlockSize = 256; rj.Key = Key; rj.IV = IV; MemoryStream ms = new MemoryStream(message); using (CryptoStream cs = new CryptoStream(ms, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Read)) { using (StreamReader sr = new StreamReader(cs)) { sRet = sr.ReadToEnd(); } } } finally { rj.Clear(); } return sRet; } string temp = DecryptRJ256(Server.UrlDecode(Decode(cypher)), keyString, ivString);

El problema que tengo es que después de recibir el mensaje cifrado de php, lo convertí en byte [] y luego lo convertí de nuevo en una cadena codificada en UTF8 para poderlo codificar. luego introduzco el resultado en la función donde convertí la cadena de nuevo a byte [] y la ejecuté durante el proceso de descifrado. Sin embargo, no puedo obtener el resultado deseado ... ¿alguna idea?

Gracias por adelantado.