Era un gobernante romano conocido por sus estrategias militares y su excelente liderazgo. El nombre de él, el cifra César es una técnica criptográfica fascinante que Julius César empleó para enviar señales y mensajes secretos a su personal militar.
El cifrado César es bastante básico en su trabajo. Funciona cambiando todas las letras del mensaje para estar encriptadas por un número fijo de lugares, llamado clave. La persona que lo recibe es consciente de la clave y la usa para descifrar el mensaje, proporcionando así una forma fácil e inteligente de llevar a cabo correspondencia privada.
Comprender el proyecto
En este artículo, aprenderemos cómo implementar el cifre César en Python. Este es un proyecto para principiantes donde utilizaremos declaraciones condicionales, bucles y funciones para codificar y decodificar datos de entrada del usuario.
Así es como funcionará el programa: El programa solicita al usuario que un mensaje sea codificado o decodificado. El usuario elige cifrado o descifrado. El programa solicita la clave por la cual se encriptará el mensaje. Una vez que el usuario proporciona la clave, el programa convertirá el mensaje al convertir cada letra del mensaje de acuerdo con la clave, ya sea cambiando las letras hacia adelante si codifica o se retroceso si decodifica.
Primero definamos los pasos del proyecto con la ayuda de un diagrama de flujo.
Paso 1: Definición de la lista del alfabeto
En primer lugar, usaremos el Lista Tipo de datos en Python para crear una lista de las letras en el alfabeto. Las listas de Python son una secuencia de elementos en un orden específico y tienen varias funciones incorporadas. El programa utilizará esta lista como referencia a las letras de cambio hacia adelante o hacia atrás de acuerdo con la opción de codificar o decodificar. Definamos la lista, alphabet.
alphabet = ['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']
Paso 2: solicite la entrada del usuario
El siguiente paso es tomar la entrada del usuario. Le preguntaremos al usuario:
- Si quieren codificar o decodificar un mensaje
encode_or_decode - El mensaje respectivo
secret_messageque quieren codificar o decodificar, y - El número de cambio
keypor el cual el mensaje será codificado o decodificado.
encode_or_decode = input("Type 'encode' to encrypt, type 'decode' to decrypt:\n").lower()
secret_message = input("Type your message here:\n").lower()
key = int(input("Type the key:\n"))
Asegúrese de convertir el key en un int DataType, de lo contrario, puede encontrar un problema al cambiar la letra por el número de clave, ya que Python considerará la entrada como una cadena y no como un tipo entero. Recuerde también convertir la entrada del usuario secret_message y encode_or_decode a minúsculas para que coincidan con los elementos en la lista alfabeto y una declaración condicional que vendrá adelante.
Paso 3: definir funciones y usar el operador de módulos
El siguiente paso es definir ambos encode y decode funciones que se llamarán más adelante. El encode se llamará a la función cuando el usuario elija ‘codificar’ en el encode_or_decode solicitante de entrada y el decode La función se llamará cuando el usuario tipos ‘decodifique’ en el encode_or_decode Ingreso de entrada.
Ambas funciones son bastante sencillas para codificar. Tomará el secret_messagerecorra todas las letras, y para todas las letras en la lista del alfabeto que definimos anteriormente, tomará su posición de índice, agregará el key a él y dar el shifted_position. Usaremos esto shifted_position como un índice de las letras y agrégalas al output_text que será el mensaje codificado o decodificado.
¡Pero tenemos un problema aquí! ¿Qué pasa si cambiando las letras, la posición del índice sale de la lista del alfabeto? Bueno, la solución a esto es usar un interesante operador de Python llamado ‘módulo‘. El módulo es un operador que da el resto después de la división y está simbolizado por ‘%’ en Python. Por lo tanto, el 8 % 5 igualará 3, ya que 3 es el resto que queda después de que 8 se divide por 5.
Usaremos este operador en nuestras funciones de codificación y decodificación. Entonces, considerando que la lista del alfabeto tiene 26 elementos, y si el usuario da un mensaje para codificar “vampiro” y la clave como “10”, si solo agregamos el número de clave a la posición de índice de ‘V’, 22 + 10 = 32, tendremos un error ya que no hay elemento en la posición 32 en la lista de alfabetos. Sin embargo, si queremos reiniciar la lista del alfabeto después de ‘Z’ de ‘A’, el alfabeto 32 se caería en ‘F’, que es el sexto elemento en la lista del alfabeto. Se puede lograr la misma letra y posición de índice utilizando el operador de módulos; Para un valor cambiado de 32, la letra estará en la posición del 32 % 26 = sexta. Por lo tanto, usaremos la misma lógica en la codificación de nuestras funciones de codificación y decodificación.
Aquí está la función de codificación:
def encode(message, keynumber, operation):
output_text = ""
for letter in message:
if letter in alphabet:
shifted_position = alphabet.index(letter) + keynumber
shifted_position = shifted_position % len(alphabet)
output_text = output_text + alphabet[shifted_position]
else:
output_text += letter
print("Here is the encoded text : ", output_text)
Entonces, si quiero codificar “Tengo un gato de mascota” con el número de clave ‘6’, recibiré el siguiente mensaje codificado:
Para la función de decodificación, ya que estamos decodificando, tenemos que cambiar las letras por el key En el orden inverso, es decir, al revés. Entonces, si quiero decodificar el mensaje anterior: ‘o ngbk g vkz igz’, tendré que multiplicar el número de clave por -1, de modo que en lugar de agregar la clave, reste la keyy el shifted_position se logrará moviendo la posición del índice hacia atrás.
Definamos la función de decodificación:
def decode(message, keynumber, operation):
keynumber = keynumber * -1
output_text = ""
for letter in message:
if letter in alphabet:
shifted_position = alphabet.index(letter) + keynumber
shifted_position = shifted_position % len(alphabet)
output_text = output_text + alphabet[shifted_position]
else:
output_text += letter
print("Here is the decoded text : ", output_text)
Aquí está nuestro mensaje decodificado:
Paso 4: Funciones de llamadas
Una vez que se definan nuestras funciones, las llamaremos cuando sea necesario. Si el usuario quiere cifrar un mensaje, llamaremos al encode función, y si quieren descifrar un mensaje, llamaremos al decode función. Implementemos esto en nuestro código utilizando declaraciones condicionales si, elif y de lo contrario:
if encode_or_decode == 'encode':
encode(message=secret_message, keynumber=key, operation=encode_or_decode)
elif encode_or_decode == 'decode':
decode(message=secret_message, keynumber=key, operation=encode_or_decode)
else:
print("Error")
Paso 5: Continuidad del programa
El último paso de este programa es preguntarle al usuario si desea continuar con el programa de cifrado y descifrado o finalización. Implementaremos esto con una variable continue_program Eso será cierto al principio y permanecerá así cuando el usuario quiera continuar con el programa. Si el usuario quiere finalizar, la variable cambiará a False y el programa finalizará. Incluiremos esta condición en un while bucle que se ejecutará mientras la variable permanezca True.
continue_program = True
while continue_program:
encode_or_decode = input("Type 'encode' to encrypt, type 'decode' to decrypt:\n").lower()
secret_message = input("Type your message here:\n").lower()
key = int(input("Type the key:\n"))
if encode_or_decode == 'encode':
encode(message=secret_message, keynumber=key, operation=encode_or_decode)
elif encode_or_decode == 'decode':
decode(message=secret_message, keynumber=key, operation=encode_or_decode)
else:
print("Error")
restart = input("Type 'yes' if you want to continue with the program.\nOtherwise, type 'no'.\n").lower()
if restart == "no":
continue_program = False
Conclusión
Con la inclusión del while Loop anterior, hemos implementado con éxito el programa CaSar Cipher en Python. Este proyecto exploró declaraciones condicionales if, elify else, for y while bucles y funciones de definición y llamadas. Además, también presentamos el operador de módulos en este programa para manejar las excepciones.
Puede encontrar el código fuente completo de este proyecto aquí.
Si tiene alguna pregunta o desea compartir un enfoque diferente, no dude en comentar sobre este artículo. Lo espero con ansias. ¡Feliz codificación! 🙂