¡Este es un texto traducido automáticamente que puede contener errores!
Sobre las tareas de criptografía
Estas tareas están estructuradas un poco diferente que otras tareas en Piggy, ¡me pregunto cuál es su preferencia! 😎
Al principio habrá algo de información sobre los temas y luego vendrán algunas tareas después.
Los “niveles” de esta tarea no son exactamente como los niveles anteriores, aquí las cosas se dividen más por temas.
Parte 1 - Cifrado y Descifrado de Claves Monosilábicas
Ve directamente a los ejercicios
¿Qué es un “Cifrado”?
¿Alguna vez has tenido ganas de escribir un mensaje secreto a un amigo para que nadie más pueda entenderlo? Entonces necesitas un Cifrado, o cifra en noruego. Una cifra no es sino un método que convierte el texto normal en “código” mediante la sustitución de caracteres (a menudo letras) por otros caracteres. El resultado parece tontería para quienes no saben cómo funciona el código. La idea es que solo aquellos que conocen la clave (la regla para intercambiar las letras) puedan volver a hacer comprensible el código. En otras palabras: los cifrados hacen posible los mensajes secretos, ya se trate del juego infantil con lenguaje secreto o de espías reales que envían mensajes cifrados. 😄
¿Lo sabías?
La palabra “cifra” en realidad proviene de una palabra árabe: la palabra sifr, que significa “cero”. ¡Quizás porque el código secreto parecía nada (¡ningún significado!) cuando la gente no podía descifrarlo!
Existen muchos tipos de cifras; algunos usan números, otros utilizan símbolos y la criptografía moderna emplea algoritmos muy complejos. Estos algoritmos complicados requieren matemáticas muy avanzadas, así que primero podemos revisar algunos más simples.
Cifras monográficos
Veamos primero algunos de los métodos de codificación más simples (y antiguos): los cifrados monográficos.
Monográfico puede sonar como una palabra difícil, pero podemos descomponerla: mono significa “uno”, y alfabético tiene que ver con el alfabeto.
Es decir, los cifrados monográficos son códigos donde se utiliza un único «alfabeto de cifrado» para todo el mensaje. Esto significa que cada letra del texto original siempre se sustituye por la misma letra a lo largo de todo el mensaje cifrado.
Por ejemplo, si has decidido que la A debe cambiarse por la X, entonces todas las A en el texto se convierten en X.
Cifras de César
El ejemplo clásico de un cifrado monográfico es el cifra de César (nombrado así por Julio César). Básicamente, se trata de una regla para «desplazar» todas las letras un número determinado de posiciones a lo largo del alfabeto. Se dice que el propio César utilizaba un desplazamiento de 3 letras en sus mensajes secretos. Funciona de tal manera que la A pasa a ser D, la B pasa a ser E, la C pasa a ser F y así sucesivamente a través del alfabeto. (Cuando se supera la Z, se vuelve a empezar con la A.) Un mensaje como ABC pasaría entonces a ser DEF si usamos el método de César.
Cómo funciona el cifrado César en la práctica:
- Elige una clave: Decide un número secreto (por ejemplo, 3) que indique cuántos lugares debes mover cada letra.
- Reemplaza cada letra: Para cada letra del mensaje original, encuentra la letra que se encuentra tantos lugares después de ella en el alfabeto (para la clave 3, A se convierte en D, B en E, etc. – recuerda volver a A después de Z si es necesario). Opcionalmente, también puedes incluir Æ, Ø y Å, pero esto se vuelve un poco más complicado.
- Mensaje cifrado: Reemplaza las letras y escribe el nuevo mensaje con las letras “desplazadas”. ¡Voilà – tienes un texto ilegible y secreto que solo aquellos con la clave pueden entender!
- Para descifrar (es decir, volver a convertirlo en texto legible) simplemente se hace el desplazamiento inverso. Si conoces la clave (por ejemplo, 3), es igual de fácil leer el mensaje moviendo las letras 3 hacia atrás en el alfabeto.
¿Seguridad?
Estos códigos no son muy seguros a largo plazo. Debido a que el patrón (la sustitución) es fijo, una persona con suficiente paciencia o algunos trucos ingeniosos puede descubrir rápidamente el secreto. Por ejemplo, solo hay unas pocas posibles desviaciones en el cifrado de César, igual al número de letras del alfabeto, por lo que cualquiera puede probar todas hasta que el mensaje tenga sentido; o bien usar las frecuencias de las letras para deducirlo. En otras palabras, quizás no use el cifrado de César para notas de diario súper secretas ni secretos de estado 😉.
Los cifrados monoalfabéticos son una forma fantástica de aprender el principio detrás del cifrado. Son sencillos y muestran cómo podemos usar una regla simple (una clave) para transformar un texto comprensible en algo misterioso e incomprensible, y viceversa. ¡Así que la próxima vez que quieras enviar a un amigo un mensaje secreto, puedes usar el cifrado de César! Quizás puedan crear su propia variante del alfabeto secreto de César. 🔐✨
Tareas
Lenguaje de programación?
Como antes, siéntase libre para usar cualquier lenguaje de programación que desee. Los ejemplos aquí serán en Python.
Tarea 1.1 - Cifrado de César: Cifrado
¡Ahora vamos a escribir código de verdad! Comenzaremos por lo básico creando la cifratura; según la teoría, debería ser bastante sencillo.
Implementa el cifrado con el Cifrado de César utilizando una función que reciba un texto y un número como «clave», es decir, cuántas posiciones debe rotarse el alfabeto.
Consejos sobre el método de trabajo.
- Crea una función llamada
caesarque reciba el texto a cifrar y un “shift”, es decir, cuántas posiciones debe desplazarse el texto en el alfabeto. - Recorre la letra por letra del texto.
- No queremos “desplazar” otros caracteres aparte de las letras: averigua cómo comprobar si un carácter en el texto es una letra.
- Vamos a “rotar” la letra n posiciones, es decir, debemos sumar la rotación: averigua cómo convertir el texto en números para poder sumar el shift. Pista: la función
ord(). - ¡Recuerda! Aquí obtendrás diferentes valores dependiendo de si tienes minúsculas o mayúsculas. Consulta la Tabla ASCII.
- Una vez que tengas un valor, es tan sencillo como sumar el valor de n. Pero ¿qué pasa si estás al final del alfabeto? Simplemente obtenemos tonterías después de la Z. ¿Cómo se soluciona esto? Esto requiere un poco de reflexión.
Corregir el cifrado.
Para corregir completamente el cifrado, se necesita un poco de reflexión.
- El primer paso a considerar es usar el operador módulo,
%. - Dado que el alfabeto (en inglés) consta de 26 letras, podemos tomar el módulo con
26. - Pero esto no funciona por completo, ¿ves la razón?
- Intenta imprimir (
print) el valor de un carácter usandoord(), ¿qué obtienes? - Con
aobtienes 97. Si tomas el módulo 26 con este número, obtienes 19. Recuerda que el módulo siempre dará una respuesta entre 0 y ese número. - Esto puede solucionarse guardando los valores iniciales de las mayúsculas y minúsculas, restando este valor de la letra y luego tomando el módulo. Entonces sería:
(ord(letra) - ord('a')) % 26 - Para obtener la letra correcta nuevamente, solo tienes que sumar el valor inicial otra vez.
- Después de todo esto, finalmente puedes convertir el número en una letra de nuevo. Aquí puedes usar la función
chr(). - ¡Ahora puedes agregar la letra a un resultado y devolver el texto cifrado!
Solución:
def caesar_cipher(text, shift):
result = ""
for char in text:
if char.isalpha():
# determina el punto de inicio en función de mayúsculas y minúsculas
start = ord('A') if char.isupper() else ord('a')
# El cálculo difícil del desplazamiento
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
Tarea 1.2 - Descifrado del cifrado César
El descifrado es simplemente realizar la operación inversa a la de cifrado. Se resta el desplazamiento en lugar de sumarlo.
Consejos para el método de resolución.
Usa la función que creaste en la tarea 1 para esto. Solo toma la misma función, pero al revés. Puedes hacerlo cambiando el desplazamiento por 26 - shift.
Solución:
def caesar_decrypt(text, shift):
return caesar_cipher(text, 26 - shift)
Otros cifrados monoalfabéticos (ej. Atbash)
¡También existen otros cifrados monoalfabéticos! Uno de los más sencillos es el llamado cifrado “Atbash”.
¿Cómo funciona Atbash?
Este es muy sencillo; en lugar de una rotación, las letras se mapean al alfabeto inverso. Aquí hay una tabla que muestra el mapeo:
| a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| z | y | x | w | v | u | t | s | r | q | p | o | n | m | l | k | j | i | h | g | f | e | d | c | b | a |
Tarea 1.3 - Encriptación y Desencriptación de Cifrado Atbash
Lo bueno de Atbash es que, dado que el encriptado es una transformación de 1 a 1, funciona directamente en reversa. Es decir, si has creado el encriptado, también has creado, automáticamente, el desencriptado.
¿Cómo se puede hacer esto en la práctica?
Puedes restar la letra con respecto a Z o crear una tabla de búsqueda (“Look-up”). Es decir, significa una tabla o diccionario que contiene todas las letras de la a a la z y lo que deben convertirse. Esta puede ser una buena solución si desean crear otro tipo de cifrado.
Implementación de tabla de búsqueda.
letters = {
'a': 'z'
'b': 'y'
'c': 'x'
'd': 'w'
# ... agrega el resto de las letras hacia abajo
}
Con la ayuda de esta tabla puedes ir letra por letra, luego extraer el valor por letra de la tabla de referencia, y luego imprimirlo. ¿Qué debes hacer con las letras mayúsculas y minúsculas?
Parte 2 - Criptoanálisis de cifras monoalfabéticas
En esta parte deberán intentar crear un algoritmo para “romper” una cifra César, es decir, tomar un texto cifrado y luego obtener el texto original sin conocer la clave.
Esto se puede hacer casi manualmente o bien pueden intentar emplear un simple “criptoanálisis”. Este es un concepto que veremos con más detalle más adelante, pero por ahora solo observaremos uno de los métodos más sencillos: análisis de frecuencias (frequency analysis). Pueden leer más sobre este concepto aquí: Frequency Analysis o aquí Wikipedia - frequency analysis.
Este método se puede utilizar no solo en las cifras César, sino también en algoritmos más complejos; sin embargo, la cifra César es tan sencilla que el análisis de frecuencias resulta trivial.
¿Cómo funciona el análisis de frecuencia?
El análisis de frecuencia es, como su nombre sugiere, una forma de verificar la frecuencia de las letras en un texto. ¿Por qué puede ser útil esto? Imagina que tienes un texto largo; vamos a imaginar un texto en inglés tomado de Wikipedia - frequency analysis:
In cryptanalysis, frequency analysis is the study of the frequency of letters or groups of letters in a ciphertext. The method is used as an aid to breaking classical ciphers.
Frequency analysis is based on the fact that, in any given stretch of written language, certain letters and combinations of letters occur with varying frequencies. Moreover, there is a characteristic distribution of letters that is roughly the same for almost all samples of that language. For instance, given a section of English language, E, T, A and O are the most common, while Z, Q, X and J are rare. Likewise, TH, ER, ON, and AN are the most common pairs of letters termed bigrams or digraphs), and SS, EE, TT, and FF are the most common repeats. The nonsense phrase ETAOIN SHRDLU represents the 12 most frequent letters in typical English language text.
In some ciphers, such properties of the natural language plaintext are preserved in the ciphertext, and these patterns have the potential to be exploited in a ciphertext-only attack.
Si tomamos este texto y lo convertimos mediante el cifrado de César (también eliminando comas, espacios y otros caracteres especiales), obtenemos el siguiente texto cifrado:
xcrgneipcpanhxhugtfjtcrnpcpanhxhxhiwthijsnduiwtugtfjtcrnduatiitghdgvgdjehduatiitghxcprxewtgitmiiwtbtiwdsxhjhtsphpcpxsidqgtpzxcvraphhxrparxewtghugtfjtcrnpcpanhxhxhqphtsdciwtupriiwpixcpcnvxktchigtirwdulgxiitcapcvjpvtrtgipxcatiitghpcsrdbqxcpixdchduatiitghdrrjglxiwkpgnxcvugtfjtcrxthbdgtdktgiwtgtxhprwpgpritgxhixrsxhigxqjixdcduatiitghiwpixhgdjvwaniwthpbtudgpabdhipaahpbeathduiwpiapcvjpvtudgxchipcrtvxktcphtrixdcdutcvaxhwapcvjpvttippcsdpgtiwtbdhirdbbdclwxatofmpcsypgtgpgtaxztlxhtiwtgdcpcspcpgtiwtbdhirdbbdcepxghduatiitghitgbtsqxvgpbhdgsxvgpewhpcshhttiipcsuupgtiwtbdhirdbbdcgtetpihiwtcdchtchtewgphttipdxchwgsajgtegthtcihiwtbdhiugtfjtciatiitghxcinexrpatcvaxhwapcvjpvtitmixchdbtrxewtghhjrwegdetgixthduiwtcpijgpaapcvjpvteapxcitmipgtegthtgktsxciwtrxewtgitmipcsiwthtepiitgchwpktiwteditcixpaidqttmeadxitsxcprxewtgitmidcanpiiprz
Este texto parece imposible de “romper”, pero con la ayuda del “análisis de frecuencia” no solo es posible, sino que es fácil.
Esta figura muestra la distribución de las letras en inglés. Lo que podemos observar es que la letra E es la más frecuente, seguida por T, A y O.
Esto se puede convertir en una tabla y luego usarse para contar y analizar un texto cifrado dado para así “romperlo”. En los ejercicios a continuación deberás crear un programa capaz de romper cifrados César por su cuenta. Es cierto que el cifrado de César es tan simple que puedes revisar manualmente todas las 26 posibilidades, pero aquí buscaremos encontrar la solución completamente automáticamente.
Ejercicio 2.1 - Crear una tabla de frecuencias
En un archivo Python, crea una tabla de frecuencia de las letras del idioma inglés. Puedes intentar encontrarla tú mismo, pero si no te apetece hacerlo, ¡lo entendemos perfectamente!
Si absolutamente deseas buscarla por tu cuenta, puedes hacer lo que se indica en el Ejercicio 2.2, pero aplicándolo a un texto muy extenso.
Frecuencia de Letras en Inglés (La respuesta)
english_letter_frequency = {
'E': 12.70,
'T': 9.06,
'A': 8.17,
'O': 7.51,
'I': 6.97,
'N': 6.75,
'S': 6.33,
'H': 6.09,
'R': 5.99,
'D': 4.25,
'L': 4.03,
'C': 2.78,
'U': 2.76,
'M': 2.41,
'W': 2.36,
'F': 2.23,
'G': 2.02,
'Y': 1.97,
'P': 1.93,
'B': 1.29,
'V': 0.98,
'K': 0.77,
'J': 0.15,
'X': 0.15,
'Q': 0.10,
'Z': 0.07
}
Ejercicio 2.2 - Contar la frecuencia de letras en un texto
Ahora vamos a crear un algoritmo que encuentre la frecuencia de las letras en un texto dado.
Consejos para el procedimiento
- Comienza con una función que reciba un texto (puede ser cualquier cosa).
- En la función, crea un “diccionario” (Python Dictionaries), con entradas para cada letra del alfabeto, establecido en
0. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0}) - Recorre todo el texto y cuenta cada letra (incrementa en 1 en la entrada correspondiente en el diccionario). Aquí probablemente deberías ignorar los caracteres que no son letras, recuerda también las mayúsculas y minúsculas.
- Lleva la cuenta de cuántas letras se han contado en total.
- Cuando hayas terminado de contar, divide
/cada valor en la tabla por la longitud del texto y luego multiplica por 100, esto te dará una frecuencia porcentual. (Por supuesto, también puedes dejar que tu tabla esté entre 0 y 1). - Ahora deberías tener una tabla de frecuencias para el texto.
Tarea 2.3 - Comparar la frecuencia de un texto con la frecuencia real
Cuando hayas encontrado la frecuencia de todas las letras en el texto, puedes crear una función que encuentre la “distancia”. ¿Eh? ¿Qué se entiende por eso?
Puedes imaginarte que la frecuencia de, por ejemplo, E en el texto va a ser un número. Puedes encontrar la “distancia” que tiene con la frecuencia real, que es 12.70. Ejemplo: La frecuencia es 9.63, ¿cuál es la distancia? La distancia va a ser el valor absoluto (los números negativos se vuelven positivos) entre estos dos valores: \(12.70 - 9.63 = 3.07\).
Crea una función que recorra cada una de las letras y encuentre la distancia. Luego, suma todas las distancias a una “distancia” total.
Función matemática?
Si te preguntas cómo es la función matemática para esto, se ve así:
\(\sum_{n=0}^{N} \lvert a - b\rvert\)
Consejos sobre el método de trabajo
- Utiliza un bucle
forpara recorrer toda la tabla de frecuencias. - Para cada letra en la tabla de frecuencias, encuentra el valor absoluto comparado con la frecuencia real. Usa la función
abs()en Python para esto. - Suma todos los valores y obtendrás un resultado final.
Tarea 2.4 - “Romper” los cifrados de César
¡Ahora por fin vamos a unir todo lo que hemos hecho hasta ahora! Ahora vamos a “romper” un cifrado de César.
Crea un programa que “rompa” un cifrado de César ¡Sin intervención del usuario, debes poder introducir un texto cifrado y obtener el texto descifrado sin necesidad de una clave.
Test data
Aquí hay algunos datos de prueba que pueden usar, ¿qué dicen estos?
| Datos de prueba |
|---|
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac |
lsaizivxlmwqiwwekimwuymxiwlsvxwsmxqmklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf |
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj |
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcw |
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha |
Consejos sobre el método de trabajo
- Comienza creando una función que reciba texto como entrada.
- Usa la función de descifrado para cifros de César con rotación N sobre el texto; N comienza en 0.
- Crea una tabla de frecuencias del resultado
- Determina la distancia entre el resultado y las tablas de frecuencia reales
- Ya sea: a) registrar la distancia en una lista, o bien b) mantener un registro del valor mínimo y de la rotación (esto será la clave)
- Aumenta la rotación en 1 y repite los pasos 2 a 6 hasta que N alcance 26 (rotación completa).
- Devuelve el texto descifrado, es decir, la menor distancia corresponde a la clave correcta.

