none
cifrado Aes 128 RRS feed

  • Pregunta

  • Familia, tengo un pequeño problema, a ver, estoy desarrollando una aplicacion que envia un mensaje a un servidor, hago un request a una pagina php, y los datos deben de ir encriptados, para encriptar utilizo estos dos métodos

       public string Encrypt(string dataToEncrypt, string password, string salt)
             {
                 AesManaged aes = null;
                 MemoryStream memStream = null;
                 CryptoStream crStream = null;
                 try
                 {
                     //Generate a Key based on a Password and Salt
                     Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password,
                     Encoding.UTF8.GetBytes(salt));
                     //Create AES algorithm with 256 bit key and 128-bit block size
                     aes = new AesManaged();
                     aes.Key = rfc2898.GetBytes(aes.KeySize / 8);
                     aes.IV = rfc2898.GetBytes(aes.BlockSize / 8);
                     memStream = new MemoryStream();
                     crStream = new CryptoStream(memStream, aes.CreateEncryptor(),CryptoStreamMode.Write);
                     byte[] data = Encoding.UTF8.GetBytes(dataToEncrypt);
                     crStream.Write(data, 0, data.Length);
                     crStream.FlushFinalBlock();
                     //Return Base 64 String
                     return Convert.ToBase64String(memStream.ToArray());
                 }
                 finally
                 {
                     //cleanup
                     if (crStream != null)
                         crStream.Close();
                     if (memStream != null)
                         memStream.Close();
                     if (aes != null)
                         aes.Clear();
                 }
             }

     Bien el algoritmo funciona me cifra los datos, pero el servidor no me devuelve nada, he probado las funciones que tiene y cuando cifran la misma cadena no me devuelven el mismo resultado, es decir la misma cadena cifrada, y como no entiendo mucho de este tema no se si eso es normal, o ambos metodos ( el que hay en la aplicacion wp y el que hay en el servidor (php) tienen que devolverme lo mismo cuando cifro la misma cadena con la misma clave) dejo los metodos de encriptado y desecriptado que hay en el servidor, a ver si alguien puede arrojarme un poco de luz sobre el tema... gracias

    En el servidor tengo estos dos metodos:

    function getEncrypt($sStr, $sKey)
     {
        return base64_encode(
            mcrypt_encrypt(
                MCRYPT_RIJNDAEL_128, 
                $sKey,
                $sStr,
                MCRYPT_MODE_CBC,
                "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
            )
        );
     }
     function getDecrypt($sStr, $sKey) {
    	$cleanString=utf8_encode($sStr);
    	//echo $sStr;
        return mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128, 
            $sKey, 
            base64_decode($cleanString), 
            MCRYPT_MODE_CBC,
            "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
        );
    }

    jueves, 5 de abril de 2012 20:18

Respuestas

  • Ya lo he resuelto era la función de encriptado, la que hay en el mdsn me ha servido:

    public static byte[] Encrypt (byte[] data, byte[] key, byte[] iv) {
               //comprueba los datos pasados
                if (data == null || data.Length <= 0)
                    throw new ArgumentNullException("data");
                if (key == null || key.Length <= 0)
                    throw new ArgumentNullException("key");
                if (iv == null || iv.Length <= 0)
                    throw new ArgumentNullException("key");
     
                byte[] encrypted;
                
                using (AesManaged AESM = new AesManaged()) {
     
                    // Defaults
                    // CipherMode = CBC
                    // Padding = PKCS7
    
                    //determina el tamaño de la clave
                    AESM.KeySize = 128;
                    AESM.BlockSize = 128;
                    AESM.Key = key;
                    AESM.IV = iv;
     
                    //Encripta
                    ICryptoTransform encryptor = AESM.CreateEncryptor();
                    encrypted = encryptor.TransformFinalBlock(data, 0, data.Length);
     
                }
                return encrypted;
        }

    luego solo tienes que pasar el array de bytes que te devuelve a una cadena string y pasarlo al request del http :

    Muchas gracias Vicente :)

    • Marcado como respuesta Daniel Díaz viernes, 6 de abril de 2012 19:39
    viernes, 6 de abril de 2012 19:38

Todas las respuestas

  • Se me ocurre que el padding del final sea diferente, AES en .NET utiliza PKCS7, mira a ver si puedes asignar eso a tu version de PHP.

    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    viernes, 6 de abril de 2012 0:02
  • Ya lo he resuelto era la función de encriptado, la que hay en el mdsn me ha servido:

    public static byte[] Encrypt (byte[] data, byte[] key, byte[] iv) {
               //comprueba los datos pasados
                if (data == null || data.Length <= 0)
                    throw new ArgumentNullException("data");
                if (key == null || key.Length <= 0)
                    throw new ArgumentNullException("key");
                if (iv == null || iv.Length <= 0)
                    throw new ArgumentNullException("key");
     
                byte[] encrypted;
                
                using (AesManaged AESM = new AesManaged()) {
     
                    // Defaults
                    // CipherMode = CBC
                    // Padding = PKCS7
    
                    //determina el tamaño de la clave
                    AESM.KeySize = 128;
                    AESM.BlockSize = 128;
                    AESM.Key = key;
                    AESM.IV = iv;
     
                    //Encripta
                    ICryptoTransform encryptor = AESM.CreateEncryptor();
                    encrypted = encryptor.TransformFinalBlock(data, 0, data.Length);
     
                }
                return encrypted;
        }

    luego solo tienes que pasar el array de bytes que te devuelve a una cadena string y pasarlo al request del http :

    Muchas gracias Vicente :)

    • Marcado como respuesta Daniel Díaz viernes, 6 de abril de 2012 19:39
    viernes, 6 de abril de 2012 19:38