Autor: Luis Fernando Apáez Álvarez
-Curso PyM-
Tarea 6: Cifrado César
Fecha de Entrega: 21 de Agosto del 2022
Descripción: En esta tarea utilizaremos el concepto de funciones para implementar el cifrado césar en Python. Con ello lograremos convertir palabras que tienen sentido y significado, a palabras que a primera vista no tienen sentido y significado. Lo anterior representaría una especie de código de lenguaje que no puede ser entendido, en primera instancia, por el resto de personas que no conocen dicho código. Por ejemplo, podemos convertir la palabra cifrado a la palabra djgsbep, donde ésta última ya no es entendible, sin embargo, para alguien que conozca nuestro código de lenguaje, sabra cómo decifrar el mensaje. Puedes indagar más sobre criptografía o, en particular, sobre el cifrado césar, accediendo a los siguientes links:
(Tiempo estimado: 50 minutos)
La parte de funciones de está tarea estará dedicada a la criptografía. Veremos el cifrado césar y su implementación en Python.
Este cifrado es de los más antiguos y, actualmente, poco seguros. Consiste en trabajar con un alfabeto desplazado una cierta longitud. Por ejemplo, podemos considerar el alfabeto desplazado en un letra de tal manera que:
etcétera. De tal manera, si deseamos escribir la palabra cifrado con nuestro nuevo alfabeto obtendríamos la palabra djgsbep.
Para ello, lo primero que haremos será preguntarle al usuario la palabra que desea cifrar y crearemos una lista con las palabras del alfabeto:
# 1: pedimos al usuario que ingrese la palabra que desea cifrar
palabra = input("Ingrese su palabra: ")
# creamos una lista con las letras del alfabeto
alfabeto = ['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']
Ingrese su palabra: cifrado
Ahora, buscamos recorrer una vez (o en longitud 1) las letras del alfabeto original para así poder escribir cifrado
como la palabra djgsbep. Lo que haremos será:
# 2: Obtenemos los indices de las letras de la
# palabra que ingreso el usuario, respecto a la
# lista alfabeto
for letra in palabra:
print(alfabeto.index(letra))
2 8 5 18 0 3 15
Después, como queremos recorrer nuestro alfabeto en una posición (o en longitud 1), entonces utilizaremos los índices anteriores y les sumaremos una unidad:
# Los siguientes indices corresponde a las
# posiciones de las letras de la palabra cifrado
# Por ejemplo, los siguientes indices
# corresponden a las letras de la palabra
# djgsbep
for letra in palabra:
print(alfabeto.index(letra) + 1)
3 9 6 19 1 4 16
# Usando los indices anteriores podemos obtener
# la letra correspondiente dentro de nuestro alfabeto.
# Accederemos a las letras correspondientes
# a dichos indices dentro de alfabeto
for letra in palabra:
print(alfabeto[alfabeto.index(letra) + 1])
d j g s b e p
Con lo cual ya hemos conseguido cifrar la palabra deseada. Podemos unir las letras anteriores para formar una solo palabra:
# Nos auxiliamos de una cadena vacia
palabra_cifrada = ""
for letra in palabra:
# unimos o concatenamos cada letra
palabra_cifrada += alfabeto[alfabeto.index(letra) + 1]
# Veamos la palabra ya unida
print(palabra_cifrada)
djgsbep
Continuando, ahora debemos implementar el código para poder manejar palabras que contengan la letra z, pues, por ejemplo, veamos qué ocurre con palabras como zoom
:
# El usuario ingresa su palabra y la convertirmos
# a minusculas para evitar errores pues nuestro
# alfabeto fue definido con minusculas
palabra = input("Ingrese su palabra: ")
# Cadena vacia que contendra la palabra cifrada
palabra_cifrada = ""
for letra in palabra:
# unimos o concatenamos cada letra
palabra_cifrada += alfabeto[alfabeto.index(letra) + 1]
# Veamos la palabra ya unida
print(palabra_cifrada)
Ingrese su palabra: zoom
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) Input In [9], in <cell line: 7>() 6 # Realizamos el cifrado 7 for letra in palabra: ----> 8 print(alfabeto[alfabeto.index(letra) + 1]) IndexError: list index out of range
pues, como la z está en la última posición del alfabeto, entonces alfabeto.index("z") + 1
excede los índices que maneja la lista alfabeto
. Para solucionar este problema escribimos:
# creamos una lista con las letras del alfabeto
alfabeto = ['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']
# El usuario ingresa su palabra y la convertirmos
# a minusculas para evitar errores pues nuestro
# alfabeto fue definido con minusculas
palabra = input("Ingrese su palabra: ").lower()
# Cadena vacia que contendra la palabra cifrada
palabra_cifrada = ""
for letra in palabra:
# para el caso en que la letra sea la z:
if alfabeto.index(letra) == len(alfabeto) - 1:
# agregaremos la primer letra del
# alfabeto (la a) la cual tiene indice 0
palabra_cifrada += alfabeto[0]
else:
# continuamos uniendo cada letra
palabra_cifrada += alfabeto[alfabeto.index(letra) + 1]
# Veamos la palabra ya unida
print(palabra_cifrada)
Ingrese su palabra: zoom appn
Lo que deberás hacer será considerar el código de la celda anterior e implementarlo en una función con las siguientes especificaciones:
print(tu_funcion("Mundo"))
Salida:
nvñep
# Escribe aqui la definicion de la funcion
# que se te pide:
# .
# .
# .
Lo que realizaremos ahora será decifrar el mensaje que hemos cifrado previamente. Esto es, si tenemos la palabra nvñep
, ahora decifraremos el mensaje para obtener la palabra mundo
Para ello deberás implementar el procedimiento inverso de lo que hicimos antes:
# creamos una lista con las letras del alfabeto
alfabeto = ['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']
# El usuario ingresa su palabra y la convertirmos
# a minusculas para evitar errores pues nuestro
# alfabeto fue definido con minusculas
palabra_a_decifrar = input("Ingrese su palabra: ").lower()
# Cadena vacia que contendra la palabra DEcifrada
palabra_decifrada = ""
for letra in palabra_a_decifrar:
# unimos las letras
palabra_decifrada += alfabeto[alfabeto.index(letra) - 1]
# Veamos la palabra ya unida
print(palabra_decifrada)
Ingrese su palabra: nvñep mundo
Vemos que el caso de decifrar es más sencillo. Por ejemplo, si consideramos la letra z que tiene el último índice en nuestra lista, al considerar la letra en la posición anterior obtenemos, sin problema alguno, la letra y. Para el caso de la a que tiene el índice 0, al considerar su índice menos el uno obtenemos el número -1, pero sabemos que alfabeto[-1]
nos permite acceder al último elemento de nuestra lista, por lo cual, la "letra previa" a la letra a es la letra z.
Lo que deberás hacer será considerar el código de la celda de código anterior e implementarlo en una función con las siguientes especificaciones:
# Escribe aqui la definicion de la funcion
# que se te pide:
# .
# .
# .