Introducción:
En este artículo te muestro cómo usar la clase RSACryptoServiceProvider para encriptar
(cifrar) y desencriptar (descifrar) cadenas usando el algoritmo criptográfico RSA.
Además, en el ejemplo, te muestro cómo generar las claves, guardarlas en un fichero con la
extensión XML y después usar ese mismo fichero para usar con la clase
RSACryptoServiceProvider.
El código de este ejemplo lo tienes más abajo, tanto para Visual Basic como
para Visual C#.
En el código de VB he puesto comentarios para cada uno de los métodos, en C# no están, pero
vamos, que no creo que te cueste mirarlos en el código de Visual Basic... y si te cuesta (o
molesta), pues... ¡pan y ajo colega! que tampoco hay que ser tan delicaillo... ;-))))
En teoría debería funcionar con cualquier versión, aunque yo he usado el Visual Studio 2008
para escribir el ejemplo, sé con seguridad que también funciona con Visual Studio 2005 y casi
apostaría que con las versiones anteriores, pero no lo he probado.
Espero que te sea de utilidad.
Nos vemos.
Guillermo
El código para Visual Basic .NET (cualquier versión)
'------------------------------------------------------------------------------
' 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 código para C# (cualquier versión)
//-----------------------------------------------------------------------------
// 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;
}
}
}
Espacios de nombres usados en el código de este artículo:
System.Security.Cryptography
System.IO
System.Text