- Obtener enlace
- Correo electrónico
- Otras aplicaciones
Entrada destacada
- Obtener enlace
- Correo electrónico
- Otras aplicaciones
Cifrado César
Este cifrado es uno de los mas antiguos conocidos, Julio César lo usó para enviar órdenes a sus generales en los campos de batalla. Consistía en escribir el mensaje con un alfabeto que estaba formado por las letras del alfabeto latino normal desplazadas tres posiciones a la derecha.
Suponiendo el siguiente mensaje:
"hola"
El mensaje cifrado seria:
"krñd"
Programando Cifrado César en python
Para programar el algoritmo debemos utilizar:
- listas, para guardar el abecedario
- bucles como for para recorrer las lista y palabras
- funciones para poder definir una función de cifrado y otra de descifrado
Primero que nada debemos crea las listas que contendrán un alfabeto, que en este caso es el abecedario en minúsculas y mayúsculas.
1 2 3 4 | alfabetoMinus = ['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'] alfabetoMayus = ['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'] |
Ya teniendo el alfabeto se hace la comparación de los caracteres del mensaje con cada elemento del alfabeto. Para lo cual se recorre primero la cadena de caracteres que contiene el mensaje y después la lista que contiene el alfabeto.
Cuando se encuentra una coincidencia se le aumenta 3 a el indice donde fueron coincidentes los caracteres y se concatena la letra en la posición i+3 en una nueva cadena (Clave).
1 2 3 | if letra == alfabeto[i]: var = alfabeto[i+3] Clave = Clave + var |
Y el ejemplo completo quedaría de la siguiente forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | alfabetoMinus = ['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'] alfabetoMayus = ['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'] ''' Función codificar Palabra: String a codificar Avance: int posiciones que avanza en el alfabeto ''' def Codificar(Palabra, Avance): Clave = '' Tope = len(alfabetoMayus) Posicion = 0 for letra in Palabra: for i in range(Tope): if (i + Avance < Tope): Posicion = i + Avance else: Posicion = abs((Tope - i) - Avance) if letra == alfabetoMinus[i]: Clave = Clave + alfabetoMinus[Posicion] elif letra == alfabetoMayus[i]: Clave = Clave + alfabetoMayus[Posicion] return Clave #*************************************** Clave = Codificar("Hola", 3) print(Clave) |
- Obtener enlace
- Correo electrónico
- Otras aplicaciones
Comentarios
Con un pequeño fallo: Si el texto contiene las letras X,Y o Z (quitando los números o haciendo un alfabeto para mayúsculas y otro para minúsculas) no es capaz de aumentar el indice 3 puestos ya que es el final de la lista.
ResponderEliminarCorrigelo ya que muchos principiantes pasan por aqui ;)
Un saludo!
Si tienes razón, el fin solo fue demostrar el funcionamiento, no publique el programa complete ya que lo utilicé para dar una clase, ya pronto actualizaré todas las entradas de este blog.
Eliminaro.o
ResponderEliminarse supone q si se quiere cifrar una "y" es "b" una "x" es una "a" y una "z" es "c" pero como hago para hacer recursiva ahi?
ResponderEliminarBueno existen varias soluciones, una fácil seria comprobar el número total de elementos de la lista y restarle la diferencia 3, que sería el índice de búsqueda.
EliminarPronto subiré una versión mas completa.
Contenido actualizado! :)
ResponderEliminarHola! Justo me han pedido esto para la universidad. Pero ellos me piden que los simbolos los deje igual, llevo rato dandole vueltas pero no se me ocurre como hacerlo... Si pudieras ayudarme te lo agradeceria :)
ResponderEliminarPuedes describirme lo que tienes que hacer, no entiendo muy bien lo que necesitas.
EliminarTengo que hacer que el texto salga codificado en cesar, pero que los espacios, comas, etc no se codifiquen pero se incluyan en el texto cifrado. Es decir, que se dejen tal cual, solo cambian las letras.
ResponderEliminarbueno entonces puedes poner un else y concatenar letra a Clave,
Eliminarelse:
Clave = Clave + letra
hola
ResponderEliminarquisiera saber como se hace ese mismo ejercicio en pseint
Pasa algo curioso al desencriptar con la misma funcion
ResponderEliminar>>> encr.CodificarCesar((encr.CodificarCesar("Hola", 3)), -3)
'Hoa'
Si está raro a mi si me funciona bien
Eliminar>>> Codificar(Codificar("Hola", 3), -3)
'Hola'
Disculpa por responder tarde, también puedes ver la siguiente entrada el cual es un ejemplo mejor detallado https://tpec05.blogspot.mx/2017/09/decifrar-por-fuerza-bruta-cifrado-cesar.html
Ni mas faltaba muchisimas gracias por responder, Veamos parece que es algun tipo de error con la l que corresponde con la ñ, el error va ahi, gracias,ya mire tu otra entrada parece que aplicas la tabla ascii para ello, no pasa nada, de nuevo gracias.
Eliminarhola!!
ResponderEliminarViera que a la hora de poner un texto,separadas por un espacio, no se mantiene el espacio en el codificado
como se puede solucionar?
Hola sólo tienes que agregar un else al final que concatene el caracter no encontrado, como el espacio no está dentro de la lista de caracteres simplemente se concatenará en en la posición que se encuentra, Así (ten cuidado con la identación en los comentarios no se puede dar formato al código ).
Eliminardef Codificar(Palabra, Avance):
Clave = ''
Tope = len(alfabetoMayus)
Posicion = 0
for letra in Palabra:
for i in range(Tope):
if (i + Avance < Tope):
Posicion = i + Avance
else:
Posicion = abs((Tope - i) - Avance)
if letra == alfabetoMinus[i]:
Clave = Clave + alfabetoMinus[Posicion]
elif letra == alfabetoMayus[i]:
Clave = Clave + alfabetoMayus[Posicion]
else:
Clave = Clave + letra
return Clave
Como sería con recursividad de cola? y con tres posiciones que A=D
ResponderEliminarSi quiero que decodificarlo con todas las llaves posibles, cómo se podría hacer?
ResponderEliminarHola como puedo agregar a este programa que la frase la coloque el maestro no directamente yo :( gracias!
ResponderEliminarcon un input
Eliminar