Entrada destacada

Como usar enums en Android, kotlin

Programando: Cifrado César en Python

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)

Comentarios

  1. 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.

    Corrigelo ya que muchos principiantes pasan por aqui ;)

    Un saludo!

    ResponderEliminar
    Respuestas
    1. 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.

      Eliminar
  2. se 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?

    ResponderEliminar
    Respuestas
    1. Bueno 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.
      Pronto subiré una versión mas completa.

      Eliminar
  3. Hola! 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 :)

    ResponderEliminar
    Respuestas
    1. Puedes describirme lo que tienes que hacer, no entiendo muy bien lo que necesitas.

      Eliminar
  4. Tengo 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.

    ResponderEliminar
    Respuestas
    1. bueno entonces puedes poner un else y concatenar letra a Clave,
      else:
      Clave = Clave + letra

      Eliminar
  5. hola
    quisiera saber como se hace ese mismo ejercicio en pseint

    ResponderEliminar
  6. Pasa algo curioso al desencriptar con la misma funcion
    >>> encr.CodificarCesar((encr.CodificarCesar("Hola", 3)), -3)
    'Hoa'

    ResponderEliminar
    Respuestas
    1. Si está raro a mi si me funciona bien
      >>> 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

      Eliminar
    2. 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.

      Eliminar
  7. hola!!
    Viera que a la hora de poner un texto,separadas por un espacio, no se mantiene el espacio en el codificado
    como se puede solucionar?

    ResponderEliminar
    Respuestas
    1. 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 ).

      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]
      else:
      Clave = Clave + letra
      return Clave

      Eliminar
  8. Como sería con recursividad de cola? y con tres posiciones que A=D

    ResponderEliminar
  9. Si quiero que decodificarlo con todas las llaves posibles, cómo se podría hacer?

    ResponderEliminar
  10. Hola como puedo agregar a este programa que la frase la coloque el maestro no directamente yo :( gracias!

    ResponderEliminar

Publicar un comentario