¡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 a las otras tareas en Piggy, ¡me pregunto qué prefieren! 😎
Primero habrá una parte de información sobre los temas, ¡luego habrá algunas tareas después!
Los “niveles” en esta tarea no son exactamente como los niveles anteriores, aquí las cosas están más divididas por temas.
Saltar directamente a las tareas
¿Qué es un “Cipher”?
¿Alguna vez has tenido el deseo de escribir un mensaje secreto a un amigo, de modo que nadie más pueda entenderlo? ¡Entonces necesitas un Cipher, o chiffer en Noruego! Un chiffer es simplemente un método que transforma texto normal en “código” al reemplazar caracteres (a menudo letras) con otros caracteres. El resultado parece tonterías para aquellos que no saben cómo funciona el código. El punto es que solo aquellos que conocen la clave (la regla para reemplazar las letras) pueden hacer que el código sea comprensible nuevamente. En otras palabras: los chiffer hacen posibles los mensajes secretos, ya sea el juego de la infancia con un lenguaje secreto o espías reales que envían mensajes encriptados. 😄
¿Sabías?
La palabra “chiffer” en realidad proviene de una palabra árabe: la palabra sifr, que significa “cero”. ¡Quizás porque el código secreto parecía nada (¡cero significado!) cuando la gente no podía resolverlo!
Existen muchos tipos de cifrados: algunos usan números, algunos usan símbolos, y la criptografía moderna usa algoritmos muy complicados. ¡Estos algoritmos complicados requieren matemáticas muy complejas, así que podemos mirar algunos algoritmos más sencillos primero!
Cifrados Monoalfabéticos
Veamos primero algunos de los métodos de codificación más simples (y antiguos) que existen: cifrados monoalfabéticos.
Monoalfabético quizás suene como una palabra difícil, pero podemos dividirla: mono significa “uno”, y alfabético se refiere al alfabeto.
Es decir, los cifrados monoalfabéticos son códigos donde se utiliza un único “alfabeto de cifrado” para todo el mensaje. Esto significa que cada letra en el texto original siempre se sustituye por la misma letra a lo largo de todo el mensaje cifrado.
Por ejemplo, si has decidido que A se sustituya por X, entonces todas las A en el texto se transforman en X.
Cifrado César
El ejemplo clásico de un cifrado monoalfabético es el cifrado César (llamado así por Julio César). Básicamente, es una regla para “desplazar” todas las letras un cierto número de posiciones en el alfabeto. Se dice que César mismo usó un desplazamiento de 3 letras en sus mensajes secretos. Funciona de tal manera que A se convierte en D, B se convierte en E, C se convierte en F, y así sucesivamente a través del alfabeto. (Cuando se pasa de Z, se vuelve a empezar por A.) Un mensaje como ABC se convertiría en 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 inteligentes puede fácilmente revelar el secreto. Por ejemplo, solo existen unos pocos desplazamientos posibles en el cifrado César, tantos como letras en el alfabeto, por lo que cualquiera puede probarlos todos hasta que el mensaje tenga sentido, o usar frecuencias de letras para adivinar. En otras palabras, quizás no uses el cifrado César para notas de diario supersecretas o 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
Forståelse av krav
- Les nøye: Gå gjennom alle kravdokumenter og spesifikasjoner.
- Spørsmål: Still spørsmål om uklarheter eller mangler.
- Avklaring: Sørg for at du forstår hva som forventes.
Utvikling
- Koding: Skriv ren og effektiv kode.
- Testing: Utfør grundig testing av all kode.
- Dokumentasjon: Dokumenter koden din.
Implementering
- Integrasjon: Integrer koden med eksisterende systemer.
- Overvåking: Overvåk systemet for feil.
- Optimalisering: Optimaliser systemet for ytelse.
Vedlikehold
- Feilretting: Rett feil og mangler.
- Oppdateringer: Implementer oppdateringer og forbedringer.
- Sikkerhet: Sikre systemet mot trusler.
¿Lenguaje de programación?
Como antes, ¡usa libremente cualquier lenguaje de programación que desees! Los ejemplos aquí estarán en Python.
Tarea 1.1 - Encriptación de Cífras de César
Ahora vamos a escribir código de verdad. Empezaremos de forma sencilla creando el cifrado, basado en la teoría debería ser bastante directo.
Implementa el cifrado con Cífras de César utilizando una función que reciba texto y un número que sea la “clave”, es decir, cuánto debe rotarse el alfabeto.
Consejos para el procedimiento.
- Crea una función que se llame
caesarque reciba el texto que se va a encriptar y un “shift”, es decir, cuántas posiciones en el alfabeto se debe desplazar el texto. - Recorre letra por letra en el texto.
- No vamos a “desplazar” otros caracteres que no sean letras: averigua cómo comprobar que un carácter en el texto es una letra.
- Vamos a “rotar” la letra con n posiciones, es decir, tenemos que sumar la rotación: averigua cómo puedes convertir el texto a números para que puedas sumar el desplazamiento. Pista: la función
ord(). - ¡Recuerda! Aquí obtendrás diferentes valores dependiendo de si tienes letras mayúsculas o minúsculas. Refiérete a Tabla ASCII.
- Después de tener un valor, es tan simple como sumar n el valor. Pero, ¿qué pasa si estás al final del alfabeto? Solo obtendrás tonterías después de la letra Z. ¿Cómo se soluciona esto? Esto requiere un poco de reflexión.
Solucionar el cifrado.
Para solucionar el cifrado por completo se requiere un poco de reflexión.
- El primer paso a tener en cuenta es el uso del 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 del todo, ¿ves la razón?
- Intenta
printel valor de un carácter conord(), ¿qué obtienes? - Para
aobtienes 97. Si tomas módulo 26 con esto, obtienes 19. Recuerda que módulo siempre dará una respuesta entre 0 y el número. - Esto se puede solucionar guardando el valor inicial de las letras mayúsculas y minúsculas, restando este valor de la letra y luego tomando el módulo. Entonces se convierte en:
(ord(letra) - ord('a')) % 26 - Para obtener la letra correcta, simplemente suma el valor inicial de nuevo.
- Después de todo esto, finalmente puedes convertir el número en una letra de nuevo. Aquí puedes usar la función
chr(). - Ahora finalmente 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():
# finn ut startpunktet basert på store og små bokstaver
start = ord('A') if char.isupper() else ord('a')
# Den vanskelige shifte-utregningen
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 hacer el cálculo inverso al cifrado. Se resta el desplazamiento en lugar de sumarlo.
Consejos para el procedimiento.
Usa la función que creaste en la tarea 1 para esto. Simplemente toma la misma función, pero a la inversa. Puedes hacer esto invirtiendo el valor con 26 - shift.
Solución:
def caesar_decrypt(text, shift):
return caesar_cipher(text, 26 - shift)
Otros Cifrados Monoalfabéticos (ej. Atbash)
Existen otros cifrados monoalfabéticos también! Uno de los más sencillos es el que se llama “Atbash” Cifrado.
¿Cómo funciona Atbash?
Esta es muy sencilla, 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 en relación con Z, o crear una “Look-up” table. Es decir, una tabla o diccionario que contiene todas las letras de la a a la z y lo que deben ser. Esto puede ser una buena solución si quieren crear otro tipo de encriptación.
Implementación de tabla de consulta.
letters = {
'a': 'z'
'b': 'y'
'c': 'x'
'd': 'w'
# ... añadir 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 Cifrados Monoalfabéticos
En esta parte, van a intentar crear un algoritmo para “crackear” un cifrado César, es decir, tomar un texto cifrado y luego obtener el texto original sin conocer la clave.
Esto puede hacerse más o menos manualmente, o pueden intentar utilizar un “criptoanálisis” sencillo. Este es un concepto que exploraremos más a fondo más adelante, pero por ahora solo vamos a ver una de las formas más sencillas: análisis de frecuencia (frequency analysis). Pueden leer más sobre este concepto aquí: Frequency Analysis o aquí Wikipedia - frequency analysis.
Este método puede utilizarse en más que solo cifrados César; puede utilizarse en algoritmos más complejos también, pero el cifrado César es tan sencillo que el análisis de frecuencia es trivial.
¿Cómo funciona el análisis de frecuencia?
El análisis de frecuencia es, como sugiere el nombre, una forma de comprobar la frecuencia de las letras en un texto. ¿Por qué esto puede ser útil? Imagina que tienes un texto largo, vamos a imaginar un texto en inglés, extraído 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 modificamos con un cifrado César (y también eliminamos comas, espacios y otros caracteres especiales), obtenemos el siguiente texto cifrado:
xcrgneipcpanhxhugtfjtcrnpcpanhxhxhiwthijsnduiwtugtfjtcrnduatiitghdgvgdjehduatiitghxcprxewtgitmiiwtbtiwdsxhjhtsphpcpxsidqgtpzxcvraphhxrparxewtghugtfjtcrnpcpanhxhxhqphtsdciwtupriiwpixcpcnvxktchigtirwdulgxiitcapcvjpvtrtgipxcatiitghpcsrdbqxcpixdchduatiitghdrrjglxiwkpgnxcvugtfjtcrxthbdgtdktgiwtgtxhprwpgpritgxhixrsxhigxqjixdcduatiitghiwpixhgdjvwaniwthpbtudgpabdhipaahpbeathduiwpiapcvjpvttudgxchipcrtvxktcphtrixdcdutcvaxhwapcvjpvteapxcitmipgtegthtgktsxciwtrxewtgitmipcsiwthtepiitgchwpktiwteditcixpaidqttmeadxitsxcprxewtgitmidcanpiiprz
Este texto parece imposible de “crackear”, pero con la ayuda del “Análisis de Frecuencia” no solo es posible, sino fácil.
Esta es una figura que muestra la distribución de las letras en inglés. Lo que podemos ver es que la letra E es la letra más frecuente, seguida por T, A y O.
Esto se puede convertir en una tabla y luego utilizar para contar y analizar un texto cifrado dado para luego “crackearlo”. En las tareas a continuación, debes crear un programa que pueda “crackear” cifrados César por sí solo. Es cierto que el cifrado César es tan simple que puedes simplemente comprobar las 26 posibilidades manualmente, pero aquí vamos a encontrar la solución, completamente automáticamente.
Tarea 2.1 - Crear una tabla de frecuencias
En un archivo python, crea una tabla de frecuencias de las letras del idioma inglés. Puedes intentar encontrarla tú mismo, pero si no te molesta, lo entendemos!
Si absolutamente quieres encontrarla tú mismo, puedes hacer como en la Tarea 2.2, pero en un texto muy grande.
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
}
Tarea 2.2 - Contar la frecuencia de las 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 para el procedimiento
- Usa un
for-loop para 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” el Cifrado César
Ahora vamos a juntar todo lo que hemos hecho hasta ahora! Ahora vamos a “romper” un Cifrado César.
Crea un programa que “rompa” un Cifrado César! Sin influencia del usuario, deberás poder introducir un texto cifrado para obtener el texto descifrado sin necesidad de una clave.
Datos de prueba
Aquí hay algunos datos de prueba que pueden usar, ¿qué dicen estos?
Datos de prueba cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxaclsaizivxlmwqiwwekimwuymxiwlsvxwsmxqmklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsfbmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyjzwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcwuwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha
Consejos para el procedimiento
- Comienza creando una función que reciba texto.
- Usa la función de descifrado para el cifrado César con rotación N en el texto, N comienza en 0.
- Crea una tabla de frecuencias del resultado
- Averigua la distancia del resultado con respecto a la tabla de frecuencias real
- O: a) lleva el control de la distancia en una lista, o b) lleva el control del valor mínimo y la rotación (esto se convierte en la clave)
- Aumenta la rotación en 1 y repite el paso 2 al 6 hasta que N alcance 26 (rotación completa).
- Retorna el texto descifrado, es decir, la distancia mínima es la clave correcta.

