el Guille, la Web del Visual Basic, C#, .NET y más...

Criptografía: Cifrar y descifrar con RSA

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

Ejemplos de cómo cifrar y descifrar usando las clases para encriptar con algoritmo RSA (RSACryptoServiceProvider). Se muestra también cómo guardar las claves en un fichero y después usarlas desde ese fichero.



 

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

 


Código para Visual Basic.NET (VB.NET) 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

 

Código para C Sharp (C#) 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
 



 


La fecha/hora en el servidor es: 22/12/2024 17:19:33

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024