Saltar la navegación

4.2.1. Protejo también usando Python

1. Cifrando como el César

Para comenzar a familiarizarnos con el cifrado de mensajes, vamos a trabajar un rápido ejemplo de un cifrado sencillo en Python para realizar por parejas, ya que sabemos que ¡dos cabezas piensan más que una!

Debéis saber que el cifrado César consiste en ir sustituyendo cada letra del mensaje a cifrar, por una letra que se encuentra a un número fijo de posiciones en el alfabeto, de la original (se llama así porque lo ideó el empreador romano Julio César). Veamos un ejemplo:

Texto cifrado: CASA -> ECUCComo podéis observar es un sistema de cifrado tan simple, que sólo sirve para textos enteros en mayúsculas o enteros en minúsculas.

Pasos que debéis dar:

  1. Crear un pseudocódigo que os ayude a visualizar el programa tras leer los puntos siguientes.
  2. Pedir por teclado el texto a cifrar. Lo meteremos en una variable llamada texto.
  3. Crear la cadena de letras del abecedario por la que nos moveremos para obtener la letra de sustitución. A esta variable la llamaremos cadena. Nuestro programa debe funcionar tanto para textos en mayúsculas como para textos en minúsculas, por lo que la variable que inicializamos con las letras del alfabeto debe tener las letras en mayúsuclas o en minúsculas según el texto que hayamos introducido por teclado (PISTA: usa la estructura IF-ELSE y la función texto.upper() para la condición).
  4. Pide por teclado el valor de desplazamiento que vamos a usar en el código a aplicar (variable desp).
  5. Crea una variable para almacenar la cadena resultado (por ejemplo: cifrado="")
  6. Recorre la cadena texto con un bucle introduciendo en la variable cifrado el carácter que se encuentre en el lugar resultante de sumar desp al índice de la variable cadena donde se encuentra la  letra actual que estamos cifrando. Os ayudará usar un bucle:
    for c in texto: y también os ayudará la función cadena.index(c)
  7. ¡Imprimid vuestro mensaje cifrado!

¿Necesitáis ayuda?

¿Se parece vuestro programa a este?

Programa solución cifrado César

2. Escribiendo en clave de enigma

Vas a conocer ahora el mecanismo que permite ayudar a conseguir los requisitos de seguridad trabajados en el apartado anterior y que implementa un cifrado como el que acabas de trabajar, pero mucho más avanzado: la criptografía.

¿Qué es?

CriptografíaCriptografía es escribir con clave secreta o de un modo enigmático. Con esta finalidad, dado un mensaje en claro, es decir, mensaje reconocible, al que se le aplique un algoritmo de cifrado, se generará como resultado un mensaje cifrado que sólo podrá ser descifrado por aquellos que conozcan el algoritmo utilizado y la clave que se ha empleado.

Vamos a conocer los diferentes tipos de cifrado digital existentes hoy en día, comenzando con el más simple y acabando con el más seguro, utilizado actualmente en los sistemas informáticos para obtener fiabilidad, confidencialidad, integridad y autenticación en la comunicación.



Clave simétrica

En este caso, se emplea una sola clave para cifrar y descifrar el mensaje:

Esquema de clave simétrica

CASO: Alice ha escrito un mensaje para Bob, pero quiere asegurarse de que nadie más que él lo lee. Por esta razón:

  1. Ha decidido cifrarlo con una clave. Para que Bob pueda descifrar el mensaje, Alice deberá comunicarle dicha clave secreta.
  2. Bob recibe el mensaje y la clave y realiza el descifrado.

VENTAJA: Es el método más veloz, lo cual hace que éste tipo de algoritmos sean los más apropiados para el cifrado de grandes cantidades de datos.

INCONVENIENTE: la necesidad de distribuir la clave que se emplea para el cifrado hace a este método algo inseguto, por lo que si alguien consigue hacerse tanto con el mensaje como con la clave utilizada, podrá descifrar el mensaje.

Clave asimétrica

En este caso, cada usuario del sistema criptográfico ha de poseer una pareja de claves:

  • Clave pública: será conocida por todos los usuarios.
  • Clave privada: será custodiada por su propietario y no se dará a conocer a ningún otro.

Esta pareja de claves es complementaria: lo que cifra una SÓLO lo puede descifrar la otra y viceversa. Estas claves se obtienen mediante métodos matemáticos complicados de forma que por razones de tiempo de cómputo, es imposible conocer una clave a partir de la otra.

CASO: Ana y Davidtienen sus pares de claves respectivas: una clave privada que sólo ha de conocer el propietario de la misma y una clave pública que está disponible para todos los usuarios del sistema.

VENTAJA: Ya no hay necesidad del envío de la clave, siendo por lo tanto un sistema más seguro.

INCONVENIENTE: la lentitud de la operación.

Clave pública

El uso de claves asimétricas ralentiza el proceso de cifrado. Para solventar dicho inconveniente, el procedimiento que suele seguirse para realizar el cifrado de un mensaje es utilizar un algoritmo de clave pública junto a uno de clave simétrica.

Esquema de cifrado de clave pública

Clic para ampliar

CASO:

Alice y Bob tienen sus pares de claves respectivas.

  1. Alice escribe un mensaje a Bernardo. Lo cifra con el sistema de criptografía de clave simétrica. La clave que utiliza se llama clave de sesión y se genera aleatoriamente.
  2. Para enviar la clave de sesión de forma segura, esta se cifra con la clave pública de Bob, utilizando por lo tanto criptografía de clave asimétrica.
  3. Bob recibe el mensaje cifrado con la clave de sesión y esta misma cifrada con su clave pública. Para realizar el proceso inverso, en primer lugar utiliza su clave privada para descifrar la clave de sesión
  4. Una vez ha obtenido la clave de sesión, ya puede descifrar el mensaje.

VENTAJA: Se consigue confidencialidad (sólo podrá leer el mensaje el destinatario del mismo) e integridad (el mensaje no podrá ser modificado).

INCONVENIENTE:  Quedan sin resolver los problemas de autenticación y de no repudio. Para remediarlos, veremos a continuación las aplicaciones de este último tipo de cifrado.

Se ha definido, tradicionalmente, como el ámbito de la criptología que se ocupa de las técnicas de cifrado o codificado destinadas a alterar las representaciones lingüísticas de ciertos mensajes con el fin de hacerlos ininteligibles a receptores no autorizados.

3. Los mecanismos de clave pública triunfan

Gracias a los mecanismos de clave pública, las personas podemos realizar muchos trámites cotidianos por medio de las nuevas tecnologías, ya que este mecanismo nos proporciona integridad y confidencialidad. Faltaba por asegurar la autenticación, que estas aplicaciones nos proporcionan ya. ¡Ponte al día!

Firma electrónica

Funcionamiento firma digital




La firma digital es un cifrado del mensaje que se está firmando pero utilizando la clave privada en lugar de la pública. De tal manera, se tiene la seguridad de que el mensaje que ha podido descifrarse utilizando la clave pública sólo pudo cifrarse utilizando la privada.

Con este sistema conseguimos:

  • Autenticación: la firma digital es equivalente a la firma física de un documento.
  • Integridad: el mensaje no podrá ser modificado.
  • No repudio en origen: el emisor no puede negar haber enviado el mensaje.

Certificado digital

Un certificado digital es un documento electrónico que asocia una clave pública con la identidad de su propietario, representándolo oficialmente en los trámites informáticos.

Adicionalmente, además de la clave pública y la identidad de su propietario, un certificado digital puede contener otros atributos para, por ejemplo, concretar el ámbito de utilización de la clave pública, las fechas de inicio y fin de la validez del certificado, etc. El usuario que haga uso del certificado podrá, gracias a los distintos atributos que posee, conocer más detalles sobre las características del mismo.

Autoridad de certificación

Autoridad de Certificación

¿Cómo confiar si un determinado certificado es válido o si está falsificado?

La manera en que se puede confiar en el certificado de un usuario con el que nunca hemos tenido ninguna relación previa es mediante la confianza en terceras partes. La idea consiste en que dos usuarios puedan confiar directamente entre sí, si ambos tienen relación con una tercera parte ya que ésta puede dar fé de la fiabilidad de los dos.

Esto se denomina Tercera Parte Confiable (TPC ó TTP, Trusted Third Party) y la TPC que se encarga de la firma digital de los certificados de los usuarios de un entorno de clave púbica se conoce con el nombre de Autoridad de Certificación (AC).

Entidad de confianza, responsable de emitir y revocar los certificados, utilizando en ellos la firma electrónica, para lo cual se emplea la criptografía de clave pública.

4. Nuestro programa también es seguro

Usuario y contraseñaHemos decidido dotar de seguridad a nuestro programa de reserva de butacas en el cine: ahora sólo podrán realziar reservas los clientes que conocen la contraseña. Para ello, nuestra contraseña está previamente configurada en la aplicación, pero para mantenerla almacenada de forma segura hemos decidido aplicarle un cifrado de clave pública RSA. Es la aplicación directa de los conocimientos que acabas de conocer en este apartado sobre criptografía. ¡Sigue los pasos y aprende a programarlo en Python! 

En la columna izquierda encontrarás las indicaciones de cómo realizar las acciones que te resultarán novedosas si nunca has trabajado con los comandos para encriptar/desencriptar en Python. No te olvides de ir probando todos los comandos en tu IDLE a medida que construyes el programa.

Instalamos la librería pycryptodome

pycryptodome es una librería que utiliza primitivas criptográficas de bajo-nivel. La necesitarás usar para encriptar en Python. Instálala con los siguientes comandos:

  1. Abre tu terminal de consola, ya sea en Windows o en Linux.
  2. Utiliza uno de los siguientes comandos (según tu SO te acepte uno u otro):

COMANDOS

>>pip install pycryptodome
O bien
>>python.exe -m pip install pycryptodome

RESULTADO

Instalando pycryptodome

Importamos librerías necesarias

  • Importamos el módulo RSA que nos permite generar las claves pública y privada:
    from Crypto.PublicKey import RSA
  • Importamos el módulo PKCS1_OAEP que nos permite crear variables de tipo clave pública y clave privada (variables especiales) que tendrán disponibles para su uso las funciones encode(texto) y decode(texto) para codificar y decodificar respectivamente:
    from Crypto.Cipher import PKCS1_OAEP

Generar las claves

Para generar las claves pública y privadas usamos la función generate() de RSA y el resultado lo asignamos a la variable claves. La función generate() recibe un número igual a 1024 o múltiplos suyos: es la longitud de la clave. Un tamaño de 2048 ya se considera muy seguro:

claves= RSA.generate(2048)
#Esta variable "claves" es la clave privada.
#La clave pública la genera el comando:

clave_keys.publickey()
#Posteriormente podrás asignarla a una variable o exportarla a pantalla con:
print(keys.publickey().export_key(key_format).decode())

Nota: Utilizamos la función decode() porque el cifrado trabaja con los datos en formato 'utf-8' y esta función los decodifica a texto simple.

Encriptar

Para encriptar el texto, utilizamos la variable de tipo PKCS1_OAEP donde almacenaremos la clave pública y llamamos a su función encrypt() pasándole como argumento nuestro texto a encriptar:

dato_encriptado = clave_publica.encrypt(texto.encode())

Nota: Utilizamos la función encode() porque el cifrado necesita recibir los datos en formato 'utf-8' y esta función los codifica a dicho formato.

Desencriptar

Para desencriptar el texto cifrado utilizamos la variable de tipo PKCS1_OAEP donde almacenaremos la clave privada (tenemos que desencriptar con clave privada lo cifrado con clave pública) y llamamos a su función decrypt() pasándole como argumento nuestro texto encriptado:

dato_desencriptado = clave_privada.decrypt(dato_encriptado)

Vamos a crear nuestro programa que encripta con clave pública RSA el texto que rebiba por teclado. A medida que haces el programa, remítete a los pasos de la columna izquierda para aprender cómo programar cada paso necesario:

  1. PASO: Haz la importación de las librerías necesarias.
  2. PASO: Pide al usuario el texto del mensaje que se desea encriptar y almacénalo en una variable.
  3. PASO: Genera las claves RSA utilizando una longitud de clave de 3072 bits.
  4. PASO: Crea una variable para almacenar la clave pública y otra para almacenar la clave privada. Como puedes leer en la información izquierda, deben ser de tipo PKCS1_OAEP y se crean con el comando:
    clave_publica = PKCS1_OAEP.new(aquíclave pública)
    clave_privada = PKCS1_OAEP.new(aquí clave privada)
  5. PASO: Encripta el texto recibido y muéstralo por pantalla.
  6. PASO: Para confirmar, desencripta el texto encriptado y muéstralo por pantalla.

Es un sistema criptográfico de clave pública desarrollado en 1979, que utiliza factorización de números enteros. Es el primer y más utilizado algoritmo de este tipo y es válido tanto para cifrar como para firmar digitalmente.

¿Cómo ha ido?

¿Qué resultado has obtenido?¿Se parece a este?:

Resultado obtenido del programa.

¡Enhorabuena! Ya puedes almacenar la contraseña de manera segura en el reto de este REA.

O si aún tienes dificultades, no olvides repasar cada comando y pedir ayuda. En programación todas las miradas son pocas.