La criptografía (del griego
‘(criptos), «oculto», y (grafé), «escritura») se podría traducir como la
escritura de mensajes ocultos. En la antigüedad ya se empleaban métodos de
criptografía para ocultar mensajes en tiempo de guerra, de forma que aunque el
mensajero fuera interceptado por el enemigo, el contenido del mensaje estaba a
salvo.
Uno de los primeros métodos
de criptografía documenta es el método utilizado por Julio Cesar. Es un
tipo de cifrado por sustitución que consiste en remplazar cada letra del
mensaje por otra que se encuentra un número fijo más adelante en el alfabeto.
Hoy en día, con las
tecnologías actuales, la necesidad de cifrar es mayúscula: Hablamos con
nuestros amigos, reservamos nuestras vacaciones, damos en número de nuestra
tarjeta de crédito, ofrecemos nuestros datos personales… y todo ello mediante:
·
Voz telefónica
·
Mensajería breve (SMS, WhatsApp … )
·
Datos por línea digital (ADSL, fibra, HFC) o inalámbrica (wifi, UMTS,
LTE).
·
…..
Los mensajes se transmiten
por canales inseguros, redes de compartidas de comunicación etc.… y, con toda
seguridad, vamos a tener a terceras personas acechando para obtener el
contenido del mensaje
Una vez que llegamos a la
conclusión de que es necesario encriptar (o cifrar) necesitamos decidir cómo lo
vamos a hacer. Para ello necesitaremos seleccionar un algoritmo de cifrado.
CRIPTOGRAFÍA
SIMÉTRICA
Los algoritmos de
criptografía simétrica utilizan la misma clave para los dos procesos: cifrar y
descifrar. Suelen ser sencillos de utilizar y bastante eficientes.
El emisor quiere enviar un
documento al receptor, para ello le aplica al documento un algoritmo simétrico
con una clave que también conoce el receptor. Cuando el receptor recibe el
mensaje le aplica el mismo algoritmo (inverso) con la misma clave. Si el
documento no ha sido modificado en la transmisión, el resultado será el
documento original.
Problemas de la
criptografía simétrica
El problema
principal de la criptografía simétrica es la transmisión de la clave.
¿Cómo conseguimos que el emisor y el receptor tengan la misma clave?. No
podemos enviar el mismo canal inseguro para transmitir las claves. Ya que la
clave para desencriptar habría que enviarla sin cifrar. Por ejemplo: Si quiero
enviar un mensaje secreto a una persona que está en Japón, los dos tenemos que
conocer el algoritmo de cifrado que vamos a utilizar y la clave secreta para
cifrar y descifrar. Decidimos utilizar el algoritmo AES pero ¿Cómo transmitimos
la clave? Obviamente la clave la tenemos que transmitir sin cifrar, o bien
cifrada con otra clave que a su vez la tendremos que transmitir sin cifrar y
así sucesivamente. Así que debemos garantizar un canal seguro de comunicación,
lo que no siempre resulta fácil.
Otro problema es
el almacenamiento de claves: Si en una empresa hay diez trabajadores y
todos tienen conversaciones privadas con todos, cada uno necesita establecer
nueve claves distintas con 81 canales seguros de comunicación para la
transmisión de claves. Si en vez de 10 trabajadores tuviésemos 100 trabajadores
deberíamos almacenar 10000 claves y establecer 10000 canales de comunicación
seguros distintos.
En la actualidad estos
problemas se solucionan con la criptografía asimétrica.
CRIPTOGRAFÍA
ASIMÉTRICA (o de clave pública)
Un algoritmo de criptografía
asimétrica utiliza dos claves para el envío de mensajes. Las dos claves
pertenecen a la persona que recibe el mensaje. Se utiliza una clave para
encriptar y otra para desencriptar. La clave que se emplea para cifrar se llama
clave pública y se puede entregar a cualquier persona. (De hecho hay hasta
servidores de claves públicas). La magia es que si el cifrado se ha hecho con
una clave pública sólo podre desencriptar con una clave distinta de la primear
asociada. Es decir: dos claves matemáticamente relacionadas de manera que
lo que cifras con una solo lo puedes descifrar con la otra.
Obviamente la clave pública
y privada se tienen que generar en el mismo instante y deben estar
matemáticamente relacionadas. La robustez del algoritmo asimétrico es que estas claves sean en apariencia independientes
o, dicho de otra forma, el coste computacional para obtener la clave privada a
partir de la pública sea desorbitado.
De esta forma solucionamos
los problemas de la criptografía simétrica.
·
Se cifra con la clave pública la cual se puede transmitir libremente
·
Cada usuario sólo tiene que controlar dos claves (su clave pública y su
clave privada). Para enviar un mensaje cifrado a otro usuario no tiene más que
pedirle la clave pública (o tomarla del servidor de claves) y éste se la puede
enviar por un canal no seguro.
La criptografía asimétrica
tiene algunos inconvenientes
·
Para una misma longitud de clave y mensaje se necesita mayor tiempo
de proceso.
·
Las claves deben ser de mayor tamaño que las simétricas. (Generalmente
son cinco o más veces de mayor tamaño que las claves simétricas) para
garantizar la “independencia” matemática entre ellas.
·
El mensaje cifrado ocupa más espacio que el original.
Algunos protocolos como
HTTPS o SSH, utilizan un formato hibrido de criptografía simétrica y
asimétrica. Para comunicar con un servidor SSH el cliente hace una petición al
servidor, el servidor envía al cliente su clave pública y el cliente envía al
servidor una clave cifrada con la clave pública del servidor (sólo la puede ver
el servidor con su clave privada). A partir de este momento ambos se comunican
con mensajes encriptados de forma simétrica con la clave enviada por el
cliente.
DEMOSTRACIÓN
En Visual Studio vamos a dar click en menú File à New à
Project
En la Ventana emergente le damos click a Window,
seleccionamos la opción “Console Application” y espacio Name colocamos el
nombre del proyecto que para el Ejemplo es “Demo 13 20483” y luego presionamos
el botón OK.
Procedemos a agregar a nuestra solución una nueva
librería de clases llamada ‘LibreriaClases’
Procederemos a crear una
clase llamada ‘DESEncrypt’ y haremos el llamado a la librería siguiente:
En nuestra clase codificaremos
el siguiente método:
Para luego realizar el
método que realiza la encriptación:
Continuamos con la
desepcriptación:
En la referencia de nuestro
proyecto agregamos la librería ‘LibreriaClases’ como se muestra a continuación:
Hacemos la llamada en
nuestro editor de código:
Y desarrollamos nuestra
codificación para encriptar:
El resultado sería el siguiente: