Encriptación Asimétrica

Published Saturday, November 27, 2004 11:54 PM

La encriptación asimétrica nos permite que dos personas puedan enviarse información encriptada, sin necesidad de compartir la llave de encriptación. Se utiliza una llave pública para encriptar el texto y una llave privada para desencriptarlo. A pesar de que puede sonar extraño que se encripte con un pública y desencripte con la privada, el motivo para hacerlo es el siguiente. Si alguien necesita que le envíen la información encriptada, él deja disponible la llave pública para que quienes le desean enviar algo lo encripten. Nadie puede desencriptar algo con la misma llave pública. El único que puede desencriptar es quien posea la llave privada, quien justamente es el que recibe la información encriptada.

Los algoritmos de encriptación asimétrica mas conocidos son:

  • RSA (Rivest, Shamir, Adleman): Creado en 1978, hoy es el algoritmo de mayor uso en encriptación asimétrica. Tiene dificultades en encriptar grandes volúmenes de información, por lo que es usado por lo general en conjunto con algoritmos simétricos.
  • Diffie-Hellman (& Merkle): No es precisamente un algoritmo de encriptación sino un algoritmo para generar llaves públicas y privadas en ambientes inseguros.
  • ECC (Elliptical Curve Cryptography): Es un algoritmo que se utiliza poco, pero tiene importancia cuando es necesario encriptar grandes volúmenes de información.

Como era de esperarse, en nuestra demostración utilizaremos el algoritmo de mayor uso, RSA. Debido a que el funcionamiento es diferente comparado con el algoritmo anterior, la pantalla varia levemente. Tendremos una zona donde se desplegará la llave pública generada, dejándole el almacenamiento de la llave privada a la clase miRSA.

La idea de esto es que exista una clase que te entregue una llave publica para que tu encriptes la información y luego le envíes ésta a la misma clase para que con la llave privada la desencripte.

El codigo en el lado del que va a desencriptar (a quien le mandan el texto encriptado) queda así

public class miRSA

{

       private RSACryptoServiceProvider _objKey = null;

 

       public miRSA()

       {

             this._objKey = new RSACryptoServiceProvider(1024);

       }

 

       public string ObtenerLlavePublica()

       {

             return this._objKey.ToXmlString(false);

       }

 

       private string DesEncriptar(byte[] bytEncriptado)

       {

             return System.Text.Encoding.UTF8.GetString(this._objKey.Decrypt(bytEncriptado, false));

       }

 

}

Y el código del cliente público es

private miRSA _objKey  = new miRSA();

 

RSACryptoServiceProvider _objEncriptadorPublico = new RSACryptoServiceProvider();

 

_objEncriptadorPublico.FromXmlString(this._objKey.ObtenerLlavePublica());

_objEncriptadorPublico.Encrypt(System.Text.Encoding.UTF8.GetBytes(this.txtAsimAEncriptar.Text), false);

En este ejemplo, la encriptación se produce en un lugar, luego de solicitar la clave pública a la clase (pero que perfectamente puede ser un servicio web), la información encriptada se puede enviar a este servicio web sin problemas de violación de seguridad, y sin necesidad de conocer ambas llaves. Si bien es cierto que la clase o servicio conoce ambas llaves, la llave pública no le es de ninguna utilidad.

Patrick Mac Kay
Noviembre 2004.

by pmackay
Filed under:

Comments

# pmackay said on Sunday, September 04, 2005 3:10 PM

Hola =)

Pues me sirvo bastante esta buscando sobre encriptacion asimetrica y despues de leer esto me quedo claro...

Nos vemos
Saludos ;)

# la visión de un ingeniero de campo said on Wednesday, January 31, 2007 7:56 PM

Como mencioné en el post Encriptación Asimétrica, existe una versión más funcional que combina algorítmos asimétricos y simétricos. Debido a que la encriptación asimétrica es casi 1000 veces más lenta que la simétrica, cuando la información a encriptar

Leave a Comment

(required) 
(required) 
(optional)
(required)