Encriptación Asimétrica RSA en C#

Saludos!, ya tenía mucho sin escribir algo en el blog y pues la verdad es que no había tenido mucho tiempo.

Ahora quiero tratar un post corto, pero algo interesante. Lo que vamos a hacer es encriptar cualquier cosa en C# utilizando llaves públicas y privadas, o sea encriptación asimétrica.

Empezaremos creando un nuevo proyecto/solución en Visual Studio utilizando WinForms:

image

Teniendo la solución inicial, vamos la siguiente interfaz de usuario :

image

image

Crear las llaves publicas y privadas

Primero, lo que vamos a hacer es crear una clase, que se llamará RSAProvider dentro de una carpeta llamada Code:

image

Clase RSAProvider.cs

Aquí, esta clase se encargará de hacer las encriptaciones, pero por el momento, solo tendrá la parte donde se crean las llaves Publicas y Privadas en forma de XML

image

Primero, en la línea 11 vemos una instancia de la clase RSACryptoServiceProvider que es la que contiene toda la implementación para poder trabajar con el algoritmo RSA

el método CreatePublicKey utiliza el método ToXmlString(bool) para exportar las llaves en XML en forma de cadena, el parámetro bool indica si la llave privada será incluida en la cadena, si se fijan en uno es true y en otro false.

Teniendo esta clase, agregaremos un evento al MenuStrip del Form “Crear Claves” y agregamos lo siguiente:

image

Aquí, simplemente estamos guardando las llaves privadas/publicas en archivos XML en donde se seleccionó la carpeta, si corremos la aplicación y damos clic en “Crear Claves” nos preguntará donde queremos guardar las llaves:

image

image

Cada vez que se ejecute este proceso, se crearán llaves diferentes. En mi caso estas son mis llaves:

Privada

image

Publica

image

Encriptar datos

Para encriptar datos, necesitamos solamente la llave publica, o  sea que el XML lo tendrá aquel que solo desea encriptar, pero tal vez no es necesario que el pueda desencriptar. En fin, depende de lo que desees hacer.

Primero, vamos a agregar el método que va a encriptar el texto en la clase RSAProvider:

image

Lo que hace este método, es crear una instancia RSA con la llave publica que se le da por parámetro, eso se hace con el método FromXmlString. Después con el método Encrypt se encripta los bytes (que es nuestro string) y los bytes encriptados con tal llave publica se guardan en encryptedData.

Ahora crearemos un evento del boton “Encriptar”:

image

Hacemos que se seleccione el XML de la llave publica y se manda a llamar el método estático de RSAProvider para encriptar, nos devuelve un arreglo de bytes y simplemente lo convertimos a una cadena para mostrarlo en el 2do textbox.

image

 

Desencriptar

Para desencriptar hacemos un proceso similar, primero creamos un método estático en RSAProvider:

image 

Y ahora, agregamos un evento al boton “Desencriptar”

image

Y el resultado será:

image

Cada boton nos pedirá el XML con la llave, para encriptar se necesita la llave publica, para desencriptar se necesita la privada.

 

Esto es todo, cualquier duda no duden en preguntarme!

 

Saludos!

Anuncios

13 comentarios sobre “Encriptación Asimétrica RSA en C#

  1. amigo al momento de desencriptar se revienta la aplicacion, dice: “Los datos que se van a descifrar exceden el máximo para este módulo de 128 bytes.”

  2. disculpe no se por que me sale un error de que “Los datos que se van a descifrar exceden el máximo para este módulo de 128 bytes”

  3. Hola, segun estuve leyendo, RSA tiene una limitante en cuanto al tamaño de la cadena, la cual depende del tamaño de la llave, y lei que en esos casos se tiene que dividir en “partecitas” la cadena, ¿Sabes si hay alguna regla al respecto? supongamos que mi llave es de 1024b y mi cadena de 1500 caracteres, como tengo que dividir mi cadena?, de hecho si es cierto la limitante del tamaño de la cadena porque cuando uso cadenas muy pequeñas como “hola mundo” no tengo ningun problema, pero cuando uso cadenas muy grandes marca error.
    Gracias de antemano.

    1. Amigo no creo poder darte una respuesta correcta respecto a esto.

      Lo que yo haría sería tener todo en bytes (no sé si se puede encriptar los bytes y no el texto tal cual) y dividirlo en las partes más grandes posibles a encriptar (tal vez 1024 bytes). Al final todo lo puedes poner en un mismo array de bytes, solo que al regresarlo de vuelta tendrás que hacerlo en las mismas partes. No sé si me explico jeje.

      Tal vez no te doy alguna idea, pero mejor navega en google a ver que te dice 🙂

      Saludos!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s