Desencriptar cadena de texto con C#

Podemos desencriptar cualquier cadena de texto con C# en base a una key de encriptación. El siguiente código espera un parámetro texto del que queremos desencriptar, la key secreta de encriptación, y el CyphMode).

Podemos desencriptar cualquier cadena de texto con C# en base a una key de encriptación. El siguiente código espera un parámetro texto del que queremos desencriptar, la key secreta de encriptación, y el CyphMode).

La función devolverá el valor desencriptado. Nos puede venir bien si queremos desencriptar id's de valores, por ejemplo...


public static string Decrypt(string p_InputString, string p_SecretKey, CipherMode p_CyphMode)

{

 if (String.IsNullOrEmpty(p_InputString)) {

  return String.Empty;

 } else {

  StringBuilder ret = new StringBuilder();

  byte[] InputbyteArray = new byte[Convert.ToInt32(p_InputString.Length) / 2];

  TripleDESCryptoServiceProvider Des = new TripleDESCryptoServiceProvider();

  MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();


  try {

   Des.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(p_SecretKey));

   Des.Mode = p_CyphMode;

   for (int X = 0; X <;= InputbyteArray.Length - 1; X++) {

    Int32 IJ = (Convert.ToInt32(p_InputString.Substring(X * 2, 2), 16));

    ByteConverter BT = new ByteConverter();

    InputbyteArray[X] = new byte();

    InputbyteArray[X] = Convert.ToByte(BT.ConvertTo(IJ, typeof(byte)));

   }


   MemoryStream ms = new MemoryStream();

   CryptoStream cs = new CryptoStream(ms, Des.CreateDecryptor(), CryptoStreamMode.Write);


   //Flush the data through the crypto stream into the memory stream

   cs.Write(InputbyteArray, 0, InputbyteArray.Length);

   cs.FlushFinalBlock();


   //Get the decrypted data back from the memory stream

   byte[] B = ms.ToArray();

   ms.Close();

   for (int I = 0; I <;= B.GetUpperBound(0); I++) {

    ret.Append(Convert.ToChar(B[I]));

   }

  } catch (Exception ex) {

   //   ME.Publish("SF.Utils.Utils", "DecryptString", ex, ManageException_Enumerators.ErrorLevel.FatalError);

   return String.Empty;

  }


  return ret.ToString();

 }

}


Espero que lo disfruten, compartan y comenten. ;)

"Si se puede imaginar... se puede programar."
Leer más...

Declaración de métodos en C#


Cuando uno plantea una clase en lugar de especificar todo el algoritmo en un único método es dividir todas las responsabilidades de las clase en un conjunto de métodos.
Un método hemos visto que tiene la siguiente sintaxis:
public void [nombre del método]() 
{
    [algoritmo]
}
Veremos que hay varios tipos de métodos:

Métodos con parámetros.

Un método puede tener parámetros:
public void [nombre del método]([parámetros]) 
{
    [algoritmo]
}
Los parámetros los podemos imaginar como variables locales al método, pero su valor se inicializa con datos que llegan cuando lo llamamos.

Problema 1:

Confeccionar una clase que permita ingresar valores enteros por teclado y nos muestre la tabla de multiplicar de dicho valor. Finalizar el programa al ingresar el -1.

Programa:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Tabla
{
    class TablaMultiplicar
    {
        public void CargarValor()
        {
            int valor;
            string linea;
            do
            {
                Console.Write("Ingrese un valor (-1 para finalizar):");
                linea = Console.ReadLine();
                valor = int.Parse(linea);
                if (valor != -1)
                {
                    Calcular(valor);
                }
            } while (valor != -1);
        }

        public void Calcular(int v)
        {
            for(int f=v;f<=v*10;f=f+v) 
            {
                Console.Write(f+"-");
            }
            Console.WriteLine();
        }

        static void Main(string[] args)
        {
            TablaMultiplicar tm = new TablaMultiplicar();
            tm.CargarValor();
        }
    }
}

En esta clase no hemos definido ningún atributo.
El método Calcular recibe un parámetro de tipo entero, luego lo utilizamos dentro del método para mostrar la tabla de multiplicar de dicho valor, para esto inicializamos la variable f con el valor que llega en el parámetro. Luego de cada ejecución del for incrementamos el contador f con el valor de v.
        public void Calcular(int v)
        {
            for(int f=v;f<=v*10;f=f+v) 
            {
                Console.Write(f+"-");
            }
            Console.WriteLine();
        }
Un método puede no tener parámetros como hemos visto en problemas anteriores o puede tener uno o más parámetros (en caso de tener más de un parámetro los mismos se separan por coma)
El método CargarValores no tiene parámetros y tiene por objetivo cargar un valor entero por teclado y llamar al método Calcular para que muestre la tabla de multiplicar del valor que le pasamos por teclado:
        public void CargarValor()
        {
            int valor;
            string linea;
            do
            {
                Console.Write("Ingrese un valor (-1 para finalizar):");
                linea = Console.ReadLine();
                valor = int.Parse(linea);
                if (valor != -1)
                {
                    Calcular(valor);
                }
            } while (valor != -1);
        }
Como vemos al método Calcular lo llamamos por su nombre y entre paréntesis le pasamos el dato a enviar (debe ser un valor o variable entera)
En este problema en la Main solo llamamos al método CargarValor, ya que el método Calcular luego es llamado por el método CargarValor:
        static void Main(string[] args)
        {
            TablaMultiplicar tm = new TablaMultiplicar();
            tm.CargarValor();
        }

Métodos que retornan un dato.

Un método puede retornar un dato:
public [tipo de dato] [nombre del método]([parámetros]) 
{
  [algoritmo]
  return [tipo de dato]
}
Cuando un método retorna un dato en vez de indicar la palabra clave void previo al nombre del método indicamos el tipo de dato que retorna. Luego dentro del algoritmo en el momento que queremos que finalice el mismo y retorne el dato empleamos la palabra clave return con el valor respectivo.

Problema 2:

Confeccionar una clase que permita ingresar tres valores por teclado. Luego mostrar el mayor y el menor.

Programa:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EspacioMayorMenor
{
    class MayorMenor
    {

        public void cargarValores()
        {
            string linea;
            Console.Write("Ingrese primer valor:");
            linea = Console.ReadLine();
            int valor1 = int.Parse(linea);
            Console.Write("Ingrese segundo valor:");
            linea = Console.ReadLine();
            int valor2 = int.Parse(linea);
            Console.Write("Ingrese tercer valor:");
            linea = Console.ReadLine();
            int valor3 = int.Parse(linea);
            int mayor, menor;
            mayor = CalcularMayor(valor1, valor2, valor3);
            menor = CalcularMenor(valor1, valor2, valor3);
            Console.WriteLine("El valor mayor de los tres es:" + mayor);
            Console.WriteLine("El valor menor de los tres es:" + menor);
        }

        public int CalcularMayor(int v1, int v2, int v3)
        {
            int m;
            if (v1 > v2 && v1 > v3)
            {
                m = v1;
            }
            else
            {
                if (v2 > v3)
                {
                    m = v2;
                }
                else
                {
                    m = v3;
                }
            }
            return m;
        }

        public int CalcularMenor(int v1, int v2, int v3)
        {
            int m;
            if (v1 < v2 && v1 < v3)
            {
                m = v1;
            }
            else
            {
                if (v2 < v3)
                {
                    m = v2;
                }
                else
                {
                    m = v3;
                }
            }
            return m;
        }

        static void Main(string[] args)
        {
            MayorMenor mm = new MayorMenor();
            mm.cargarValores();
            Console.ReadKey();
        }
    }
}
Si vemos la sintaxis que calcula el mayor de tres valores enteros es similar al algoritmo visto en conceptos anteriores:

Lo primero que podemos observar que el método retorna un entero y recibe tres parámetros:
        public int CalcularMayor(int v1, int v2, int v3) 

Dentro del método verificamos cual de los tres parámetros almacena un valor mayor, a este valor lo almacenamos en una variable local llamada "m", al valor almacenado en esta variable lo retornamos al final con un return.
La llamada al método calcularMayor lo hacemos desde dentro del método CargarCalores:
        mayor=CalcularMayor(valor1,valor2,valor3);

Debemos asignar a una variable el valor devuelto por el método CalcularMayor. Luego el contenido de la variable mayor lo mostramos:
            Console.WriteLine("El valor mayor de los tres es:"+mayor);
            Console.WriteLine("El valor menor de los tres es:"+menor);

La lógica es similar para el cálculo del menor.
Leer más...
Google