El cifrado es una pieza fundamental del software que usamos a diario, nos proporciona seguridad en las aplicaciones y nos facilita la privacidad en nuestras comunicaciones en nuestro día a día. Las páginas webs que visitamos a diario usan canales HTTPS, que se generan con archivos que usan cadenas de cifrado de clave publicas llamadas certificados. Las aplicaciones usan algoritmos de cifrado, para proteger las credenciales, y establecer canales seguros de transferencia de la información.
Entender como funciona, aunque sea básicamente los mecanismos de cifrados de nuestras comunicaciones y aplicaciones, se hace cada vez más necesario en el mundo digital en el que vivimos.
En elbinario hemos hablado muchas veces sobre el cifrado y mecanismos de cifrados, esta serie de artículos pretende seguir por ese camino, pero esta vez intentando ser más didáctico, explicando varios ejemplos de cifrado comunes de una forma sencilla y sus ejemplos de código, tanto para cifrar/descifrar como parar intentar romperlos.
Para empezar vamos a utilizar el cifrado Caesar un cifrado de desplazamiento muy simple que se dice que usaba Julio Cesar para enviar señales a tus tropas.
Para cifrar el mensaje el cifrado Caesar usa un método de desplazamiento, imaginar que tenemos la siguiente tabla, en la cual tenemos en la carpeta de arriba un índice numérico del 1-25 abajo representamos en cada índice una letra del Alfabeto, empezando por el número 0.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
A | B | C | D | E | F | G | H | I | J | K | L | M | Ñ | O | P | Q | R | S | T | U | V | W | X | Y | Z |
Hemos comentado que Caesar es un cifrado de desplazamiento, porque para cifrar tenemos que desplazarnos de un índice a otro de la tabla, pero para ello necesitamos un valor numérico que nos indique el número de casillas que nos tenemos que desplazar a ese valor lo llamaremos clave. Si por ejemplo queremos cifrar la letra H usando la clave 5, nos desplazaremos desde la posición 7(H) hasta la posición 12(M) , por lo que podemos decir que la letra M cifra a la H.
Ahora imagina que tenemos la frase HOLA ELBINARIO y la clave 13(la clave puede ser cualquier número entre el 1 y el 25), usando el método que hemos aprendido, lo primero que haremos será buscar la primera letra de nuestra frase en la tabla, por ejemplo la letra H que corresponde en la columna 7 y le aplicamos la clave, por lo tanto, buscamos la letra correspondiente a la columna (7+13) que es la U.
Ahora continuamos con la siguiente letra que sería la O, buscamos en nuestra columna y aplicamos la fórmula(posición de columna+clave) y nos da el número 28, ¿pero como vamos a cifrar esto si nuestro array solo tiene hasta el número 25? Pues con un truco matemático que consiste en restar la posición que tenemos al array máximo, por lo tanto, restamos (27-25) =2 buscamos la letra en la posición 2 (ojo es un array no es la columna 2 es la posición 2 ) por lo tanto, la letra que cifra la O es la B, asi continuamos hasta obtener nuestro texto cifrado que sera UbYÑRYOVÑeVb , como podemos ver aunque el cifrado Caesar sea un cifrado antiguo y totalmente inseguro no parece fácil a priori descifrar el texto sin la clave(ya veremos más adelante que hay maneras).
Ahora que sabemos como cifrar a mano un texto simple con Caesar vamos a escribir un programa muy simple en python para hacerlo, aquí está el código completo que iremos desgranando más abajo.
mensaje="HOLA ELBINARIO"
llave=13
SIMBOLOS='ABCDEFGHIJKLMÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz'
traducion=''
for simbolo in mensaje:
if simbolo in SIMBOLOS:
simboloindex=SIMBOLOS.find(simbolo)
indextranslado=simboloindex+llave
if indextranslado >=len(SIMBOLOS):
indextranslado=indextranslado-len(SIMBOLOS)
elif indextranslado < 0:
indextranslado=indextranslado + len(SIMBOLOS)
traducion=traducion + SIMBOLOS[indextranslado]
print(traducion)
La salida del programa nos devolverá lo siguiente:
/bin/python3 /home/anubys/test.py
anubys@debian2:~$ /bin/python3 /home/anubys/test.py
UbYÑRYOVÑeVb
Que es exactamente lo que habíamos hecho de forma manual con nuestra tabla, vamos a desgranar paso por paso lo que hacemos en el programa
- Creamos varias variables donde almacenamos, el texto que vamos a cifrar, los símbolos que vamos a usar, la longitud de la clave que vamos a utilizar y una variable vacía que usaremos para la salida traducida
- Creamos un bucle for donde vamos buscando cada símbolo de nuestro mensaje indicando su posición.
anubys@debian2:~$ /bin/python3 /home/anubys/test.py
H
O
L
A
E
L
B
I
A
R
I
O
anubys@debian2:~$ /bin/python3 /home/anubys/test.py
7
14
11
0
4
11
1
8
0
17
8
14
- Añadimos el valor de la llave para sumarlo a la posición inicial de cada símbolo y aplicamos los if para comprobar que la longitud del mensaje no supera a la longitud de los símbolos y vamos conformando nuestro mensaje cifrado con cada posición nueva.
anubys@debian2:~$ /bin/python3 /home/anubys/test.py
20
U
27
Ub
24
UbY
13
UbYÑ
17
UbYÑR
24
UbYÑRY
14
UbYÑRYO
21
UbYÑRYOV
13
UbYÑRYOVÑ
30
UbYÑRYOVÑe
21
UbYÑRYOVÑeV
27
UbYÑRYOVÑeVb
Como veis es muy sencillo cifrar texto con unas pocas líneas en python, para el siguiente artículo nos veremos si ¿es posible descifrar un mensaje cifrado con este método sin conocer la clave?
Happy Cracking :)