/////////////////////////////////////////////////////////// // CRIPTOGRAFIA - Técnicas de desarrollo para profesionales /////////////////////////////////////////////////////////// // Capítulo 4: Criptografía en entornos .NET // Sección 4.6: Codificaciones de casos prácticos // Apartado: 4.6.2: Funciones que implementan criptografía // de llave pública /////////////////////////////////////////////////////////// // Listado 4.10: Clase para la implementación de // criptografía asimétrica mediante el algoritmo RSA y // archivos de llaves XML. /////////////////////////////////////////////////////////// using System; using System.IO; using System.Security; using System.Security.Cryptography; public class ImplementacionRSA { public static RSACryptoServiceProvider rsa; // En este método incializaremos los parámetros correspondientes // para la encriptación y desencriptación utilizando nuestras // llaves en archivos XML. public static void InicializarRSA() { const int PROVIDER_RSA_FULL = 1; const string CONTAINER_NAME = "EjemploImplementacionRSA"; CspParameters cspParams; cspParams = new CspParameters(PROVIDER_RSA_FULL); cspParams.Flags = CspProviderFlags.UseMachineKeyStore; cspParams.KeyContainerName = CONTAINER_NAME; cspParams.ProviderName = "Microsoft Strong Cryptographic Provider"; rsa = new RSACryptoServiceProvider(cspParams); } // Método que implementa el proceso de encriptación asimétrica // utilizando la información de llaves en archivos XML public static string Encriptar(string textoPlano) { InicializarRSA(); StreamReader reader = new StreamReader(@"C:\llave_publica.xml"); string publicOnlyKeyXML = reader.ReadToEnd(); rsa.FromXmlString(publicOnlyKeyXML); reader.Close(); // Cifrar texto-plano byte[] textoPlanoBytes = System.Text.Encoding.UTF8.GetBytes(textoPlano); byte[] textoCifradoBytes = rsa.Encrypt(textoPlanoBytes,false); return Convert.ToBase64String(textoCifradoBytes); } // Este método servirá para generar y almacenar un nuevo par de llaves // para la encriptación y desencriptación asimétrica (llaves pública y // privada) public static void GenerarLlaves() { InicializarRSA(); // Proveer parámetros RSA (públicos y privados) StreamWriter writer = new StreamWriter(@"C:\llave_privada.xml"); string publicPrivateKeyXML = rsa.ToXmlString(true); writer.Write(publicPrivateKeyXML); writer.Close(); // Proveer únicamente parámetros públicos writer = new StreamWriter(@"C:\llave_publica.xml"); string publicOnlyKeyXML = rsa.ToXmlString(false); writer.Write(publicOnlyKeyXML); writer.Close(); } // Método que implementa el proceso de desencriptación asimétrica // utilizando la información de llaves en archivos XML public static string Desencriptar(string textoCifrado) { InicializarRSA(); byte[] textoCifradoBytes = Convert.FromBase64String(textoCifrado); StreamReader reader = new StreamReader(@"C:\llave_privada.xml"); string publicPrivateKeyXML = reader.ReadToEnd(); rsa.FromXmlString(publicPrivateKeyXML); reader.Close(); // Desencriptar el texto-cifrado byte[] textoPlanoBytes = rsa.Decrypt(textoCifradoBytes,false); return System.Text.Encoding.UTF8.GetString(textoPlanoBytes); } }