Criptografía
Cifrado, codificación y hash: diferencias explicadas
Separa codificación, cifrado y hash con laboratorios de Base64, SHA-256 y OpenSSL. Entiende por qué Base64 no protege y el hash es de un solo sentido.
El cifrado César desplaza cada letra un número fijo de posiciones. Cifra HELLO como KHOOR a mano, descífralo y mira por qué falla.
El cifrado César es un cifrado por sustitución. Reemplaza cada letra por otra que está a una distancia fija en el alfabeto. Si desplazas cada letra tres posiciones hacia adelante, HELLO se convierte en KHOOR. El nombre viene de Julio César, a quien la tradición atribuye el uso de un desplazamiento así en sus propios mensajes. Es lo bastante simple para hacerlo a mano, y esa simplicidad es la razón por la que casi no ofrece seguridad.
Escribe el alfabeto en una fila. En una segunda fila, escribe el mismo alfabeto desplazado tres posiciones, dando la vuelta después de la Z:
Original: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Desplazado: DEFGHIJKLMNOPQRSTUVWXYZABCPara cifrar, busca cada letra del texto original en la fila de arriba y copia la letra que está justo debajo. H pasa a K, E pasa a H, L pasa a O y O pasa a R. Así, HELLO se convierte en KHOOR. La clave es la cantidad de posiciones desplazadas, que aquí es 3.
Los espacios, los números y los signos de puntuación no están en el alfabeto de la A a la Z. En una versión didáctica pueden quedarse como están, y eso es lo que hace el código Python de abajo.
Descifrar es leer la misma tabla al revés. Desplaza cada letra tres posiciones hacia atrás, lo que es igual a desplazarla 23 posiciones hacia adelante:
KHOOR → HELLOPara una clave dada, cada letra del texto original corresponde a exactamente una letra cifrada, y el camino de vuelta es igual de inequívoco. Por eso el cifrado se puede deshacer cuando conoces la clave.
El alfabeto inglés tiene 26 letras, así que los desplazamientos se repiten cada 26 posiciones. Un desplazamiento de 29 hace lo mismo que uno de 3:
29 mod 26 = 3Un desplazamiento de −3 hace lo mismo que uno de 23. Al escribir código, toma el módulo 26 del desplazamiento para que funcione cualquier número entero.
Esta función desplaza solo las letras de la A a la Z y de la a a la z, deja el resto como está y da la vuelta con módulo 26. Usa ord y chr para convertir entre letras y números:
def caesar(text, shift):
out = []
for ch in text:
if ch.isascii() and ch.isalpha():
base = ord('A') if ch.isupper() else ord('a')
out.append(chr((ord(ch) - base + shift) % 26 + base))
else:
out.append(ch)
return ''.join(out)
print(caesar("HELLO", 3))
print(caesar("KHOOR", -3))
print(caesar("KHOOR", 23))
print(caesar("HELLO", 29))
print(caesar("ATTACK AT DAWN", 3))
print(caesar(caesar("Hello, World!", 13), 13))
print(caesar("Hello, World!", 13))
print(caesar("hello, world", 3))
print(caesar("KHOOR", 26 - 3) == caesar("KHOOR", -3))
print(sum(1 for s in range(1, 26) if caesar("KHOOR", s) == "HELLO"))
print(caesar("HELLO", 3) == caesar("HELLO", 29))Salida al ejecutar ese script:
KHOOR
HELLO
HELLO
KHOOR
DWWDFN DW GDZQ
Hello, World!
Uryyb, Jbeyq!
khoor, zruog
True
1
TrueLa salida confirma las secciones anteriores. Los desplazamientos −3 y 23 coinciden, igual que 3 y 29. Entre los desplazamientos del 1 al 25, solo uno convierte KHOOR otra vez en HELLO. Aplicar el desplazamiento 13 dos veces devuelve el texto original, que es el caso de ROT13 descrito más abajo.
Con un alfabeto de 26 letras, solo 25 desplazamientos cambian el texto. Un atacante puede probarlos todos y ver qué resultado es legible. En textos en inglés, el resultado legible es fácil de reconocer, así que el ataque casi no cuesta esfuerzo.
Las frecuencias de las letras también sobreviven al desplazamiento. En inglés, la E es común y la Z es rara, así que un texto cifrado en el que una letra aparece mucho más que las demás ya es una pista fuerte. Incluso sin probar todos los desplazamientos, el conteo de letras apunta a la clave.
El cifrado sirve para aprender el vocabulario de la criptografía: texto en claro, texto cifrado, clave, sustitución y fuerza bruta. No debe proteger contraseñas, datos de clientes, claves de API ni archivos privados. La criptografía real usa algoritmos estandarizados, claves bien generadas y una gestión rigurosa de esas claves. La entrada de criptografía en el glosario del NIST ofrece las definiciones formales del área.
ROT13 es un cifrado César con desplazamiento 13. Es su propio inverso: aplicarlo dos veces devuelve el texto original, porque 13 + 13 = 26 y una vuelta completa al alfabeto no cambia nada. El ROT13 de Hello, World! es Uryyb, Jbeyq!, como se muestra arriba.
ROT13 se usa para ocultar spoilers o remates de chistes a una mirada casual. No ofrece protección real, porque quien conoce el método lo lee en segundos.
Cifra ATTACK AT DAWN a mano con un desplazamiento de 3, manteniendo los espacios. Compara tu respuesta con esta:
DWWDFN DW GDZQLuego cambia el desplazamiento en la función de Python y ejecútala con el mismo texto. Prueba los desplazamientos 0, 26 y 13, y predice cada resultado antes de ejecutarlo. Usa textos sintéticos o propios, y mantén el ejercicio en tu propia máquina.
Cuando estés listo, el siguiente artículo, Cifrado César en Python, parte de esta función y añade entrada de datos y pruebas.
Lectura adicional: la entrada de criptografía en el glosario del NIST y la documentación de Python sobre ord y chr.
Criptografía
Separa codificación, cifrado y hash con laboratorios de Base64, SHA-256 y OpenSSL. Entiende por qué Base64 no protege y el hash es de un solo sentido.
Criptografía
Por qué los hashes rápidos fallan con contraseñas, qué hacen la sal y el factor de trabajo, y cómo hashear y verificar con Argon2id en Python.
Criptografía
Claves pública y privada desde cero: qué prueba una firma, por qué la privada no sale de su dueño y un lab Ed25519 donde un archivo alterado falla.