/////////////////////////////////////////////////////////// // CRIPTOGRAFIA - Técnicas de desarrollo para profesionales /////////////////////////////////////////////////////////// // Capítulo 4: Criptografía en entornos .NET // Sección 4.4: Codificación de encriptación asimétrica /////////////////////////////////////////////////////////// // Listado 4.6: Encriptación y desencriptación de una // cadena de caracteres mediante el algoritmo RSA. // Versión C#. /////////////////////////////////////////////////////////// using System; using System.Security.Cryptography; using System.Text; class EjemploRSA { static void Main() { try { // Crear instancia de UnicodeEncoding para convertir cadena UnicodeEncoding ByteConverter = new UnicodeEncoding(); // Crear array de bytes para contener la cadena orignal, y los // resultados de la encriptación y desencriptación byte[] dataToEncrypt = ByteConverter.GetBytes("Contenido de prueba"); byte[] encryptedData; byte[] decryptedData; // Crear una nueva instancia de RSACryptoServiceProvider para // generar las llaves pública y privada RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); // Pasaje de datos a encriptar, la información de la llave // pública -RSACryptoServiceProvider.ExportParameters(false)- // y un booleano que especificará que no habrá padding OAEP encryptedData = RSAEncrypt(dataToEncrypt,RSA.ExportParameters(false), false); // Pasaje de datos a desencriptar, la información de la llave // privada -RSACryptoServiceProvider.ExportParameters(true)- // y un booleano que especificará que no habrá padding OAEP decryptedData = RSADecrypt(encryptedData,RSA.ExportParameters(true), false); // Mostrar el texto desencriptado por consola Console.WriteLine("Texto-plano desencriptado: {0}", ByteConverter.GetString(decryptedData)); } catch(ArgumentNullException) { // Tomar la excepción en el caso de que ocurriese un // problema en la encriptación Console.WriteLine("El proceso de encriptación falló."); } } static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) { try { // Crear una nueva instancia de RSACryptoServiceProvider RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); // Importar la información de la llave RSA. Aquí sólo necesitaremos // la información de la llave pública. RSA.ImportParameters(RSAKeyInfo); // Encriptar el array de bytes parámetro, y especificar // el padding OAEP (Windows XP o posterior). return RSA.Encrypt(DataToEncrypt, DoOAEPPadding); } // Capturar y mostrar por consola la excepción CryptographicException catch(CryptographicException e) { Console.WriteLine(e.Message); return null; } } static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo,bool DoOAEPPadding) { try { // Crear una nueva instancia de RSACryptoServiceProvider RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); // Importar la iformación de la llave RSA. Aquí necesitaremos // incluir la información de la llave privada. RSA.ImportParameters(RSAKeyInfo); // Desencriptar el array de bytes parámetro, y especificar // el padding OAEP (Windows XP o posterior). return RSA.Decrypt(DataToDecrypt, DoOAEPPadding); } // Capturar y mostrar por consola la excepción CryptographicException catch(CryptographicException e) { Console.WriteLine(e.ToString()); return null; } } }