Anda di halaman 1dari 7

Criptografa: Cifrar y descifrar con RSA

Publicado el 25/Abr/2008 Actualizado el 25/Abr/2008 Autor: Guillermo 'guille' Som

Ejemplos de cmo cifrar y descifrar usando las clases para encriptar con algoritmo RSA (RSACryptoServiceProvider). Se muestra tambin cmo guardar las claves en un fichero y despus usarlas desde ese fichero.

Introduccin:
En este artculo te muestro cmo usar la clase RSACryptoServiceProvider para encriptar (cifrar) y desencriptar (descifrar) cadenas usando el algoritmo criptogrfico RSA. Adems, en el ejemplo, te muestro cmo generar las claves, guardarlas en un fichero con la extensin XML y despus usar ese mismo fichero para usar con la clase RSACryptoServiceProvider. El cdigo de este ejemplo lo tienes ms abajo, tanto para Visual Basic como para Visual C#. En el cdigo de VB he puesto comentarios para cada uno de los mtodos, en C# no estn, pero vamos, que no creo que te cueste mirarlos en el cdigo de Visual Basic... y si te cuesta (o molesta), pues... pan y ajo colega! que tampoco hay que ser tan delicaillo... ;-)))) En teora debera funcionar con cualquier versin, aunque yo he usado el Visual Studio 2008 para escribir el ejemplo, s con seguridad que tambin funciona con Visual Studio 2005 y casi apostara que con las versiones anteriores, pero no lo he probado.

Espero que te sea de utilidad. Nos vemos. Guillermo

El cdigo para Visual Basic .NET (cualquier versin)


'----------------------------------------------------------------------------' CifradoRSA_VB (24/Abr/08) ' ' Guillermo 'guille' Som, 2007-2008 '----------------------------------------------------------------------------Option Strict On

Imports Microsoft.VisualBasic Imports System Imports System.Text Imports System.Security.Cryptography Imports System.IO

Public Class PruebaRSA Private Shared dirPruebas As String = "E:\Pruebas3\RSA cripto" Private Shared ficPruebas As String = Path.Combine(dirPruebas, "MisClaves.xml")

Public Shared Sub Main() ' Cifrar y descifrar con RSA Console.Title = "Cifrar y descifrar con RSA"

' Si no existe el fichero de claves, ' crearlo y guardarlo en el fichero indicado If File.Exists(ficPruebas) = False Then crearXMLclaves(ficPruebas) End If

' Leer las claves del fichero Dim xmlKeys As String = clavesXML(ficPruebas)

' Cifrar la cadena indicada Dim datos As Byte() = cifrar("Hola RSA", xmlKeys)

' Descifrar el array de bytes con la cadena cifrada Dim res As String = descifrar(datos, xmlKeys)

' Mostrar el texto descifrado

Console.WriteLine(res)

Console.ReadLine() End Sub

''' <summary> ''' Guarda las claves en el fichero indicado ''' </summary> Private Shared Sub crearXMLclaves(ByVal ficPruebas As String) Dim rsa As New RSACryptoServiceProvider()

Dim xmlKey As String = rsa.ToXmlString(True)

' Si no existe el directorio, crearlo Dim dirPruebas As String = Path.GetDirectoryName(ficPruebas)

If Directory.Exists(dirPruebas) = False Then Directory.CreateDirectory(dirPruebas) End If

Using sw As New StreamWriter(ficPruebas, False, Encoding.UTF8) sw.WriteLine(xmlKey) sw.Close() End Using

End Sub

''' <summary> ''' Lee las claves del fichero y las devuelve como una cadena ''' que se puede usar con FromXmlString de RSACryptoServiceProvider ''' </summary> Private Shared Function clavesXML(ByVal fichero As String) As String Dim s As String

Using sr As New StreamReader(fichero, Encoding.UTF8) s = sr.ReadToEnd sr.Close() End Using

Return s End Function

''' <summary>

''' Cifra el texto indicado usando las claves en formato XML ''' </summary> Private Shared Function cifrar(ByVal texto As String, ByVal xmlKeys As String) As Byte() Dim rsa As New RSACryptoServiceProvider()

rsa.FromXmlString(xmlKeys)

Dim datosEnc As Byte() = rsa.Encrypt(Encoding.Default.GetBytes(texto), False)

Return datosEnc End Function

''' <summary> ''' Descifra el array de bytes usando las claves en formato XML ''' </summary> Private Shared Function descifrar(ByVal datosEnc As Byte(), ByVal xmlKeys As String) As String Dim rsa As New RSACryptoServiceProvider()

rsa.FromXmlString(xmlKeys)

Dim datos As Byte() = rsa.Decrypt(datosEnc, False)

Dim res As String = Encoding.Default.GetString(datos)

Return res End Function

End Class

El cdigo para C# (cualquier versin)


//---------------------------------------------------------------------------// CifradoRSA_CS (25/Abr/08) // // Guillermo 'guille' Som, 2008 //----------------------------------------------------------------------------

using System; using System.Text; using System.Security.Cryptography; using System.IO;

namespace cifradoRSA_CS { class Program { private static string dirPruebas = @"E:\Pruebas3\RSA cripto"; private static string ficPruebas = Path.Combine(dirPruebas, "MisClaves_CS.xml");

static void Main() { // Cifrar y descifrar con RSA Console.Title = "Cifrar y descifrar con RSA";

// Si no existe el fichero de claves if(File.Exists(ficPruebas) == false) { crearXMLclaves(ficPruebas); }

string xmlKeys = clavesXML(ficPruebas);

byte[] datos = cifrar("Hola RSA C#", xmlKeys);

string res = descifrar(datos, xmlKeys);

Console.WriteLine(res);

Console.ReadLine(); }

private static void crearXMLclaves(string ficPruebas) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

string xmlKey = rsa.ToXmlString(true);

// Si no existe el directorio, crearlo

string dirPruebas = Path.GetDirectoryName(ficPruebas);

if(Directory.Exists(dirPruebas) == false) { Directory.CreateDirectory(dirPruebas); }

using(StreamWriter sw = new StreamWriter(ficPruebas, false, Encoding.UTF8)) { sw.WriteLine(xmlKey); sw.Close(); }

private static string clavesXML(string fichero) { string s;

using(StreamReader sr = new StreamReader(fichero, Encoding.UTF8)) { s = sr.ReadToEnd(); sr.Close(); }

return s; }

private static byte[] cifrar(string texto, string xmlKeys) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

rsa.FromXmlString(xmlKeys);

byte[] datosEnc = rsa.Encrypt(Encoding.Default.GetBytes(texto), false);

return datosEnc; }

private static string descifrar(byte[] datosEnc, string xmlKeys) {

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

rsa.FromXmlString(xmlKeys);

byte[] datos = rsa.Decrypt(datosEnc, false);

string res = Encoding.Default.GetString(datos);

return res; } } }

Anda mungkin juga menyukai