Invertir una función en Python.

Iniciado por jam man, 13 Octubre 2015, 00:07 AM

0 Miembros y 1 Visitante están viendo este tema.

jam man

Hola!!!, estoy haciendo un programa en Python de cifrado Polybios, la cuestión es de que ya tengo la primera parte del código que es cifrar una palabra o frase, este es el código:

Código (python) [Seleccionar]
texto = raw_input ("Palabra a cifrar: ").lower()                                 
diccionario = {'a':'aa', 'b':'ab', 'c':'ac', 'd':'ad', 'e':'ae',
               'f':'ba', 'g':'bb', 'h':'bc', 'i':'bd', 'j':'bd',
               'k':'be', 'l':'ca', 'm':'cb', 'n':'cc', 'ñ':'cc',
               'o':'cd', 'p':'ce', 'q':'da', 'r':'db', 's':'dc', 't':'dd',
               'u':'de', 'v':'ea', 'w':'eb', 'x':'ec', 'y':'ed', 'z':'ee'}
textoleet = ''
for v in texto:
        if v in diccionario.keys():
                textoleet += diccionario[v]
        else:
                textoleet += v
print(textoleet)


pero el detalle es hacer lo contrario, que al momento de ingresar una palabra o frase ya cifrada, ahora que lo descifre, ejemplo:

si ingreso "PYTHON", la palabra cifrada seria "ceedddbccdcc" y ahora quiero que haga lo contrario que al ingresar cualquier texto, lo descifre.

tincopasan

este tema es un dejavú. ¿es un ejercicio de alguna clase?
bueno, ahora es lo mismo pero lees el valor en lugar de la clave y la cadena cada 2 caracteres:
algo asi:
mientras cadena < que largo de cifrada
             tomar primeros 2 caracteres y buscar valor en diccionario
             limpia = limpia + clave
             sumar 2 caracteres a cifrada
mostrar limpia

jam man

si es para una materia de Seguridad Informática.

tincopasan

#3
ok, en base a tu código hice basicamente lo mismo , con una pequeña modificación para descifrar
Código (python) [Seleccionar]
#-*- coding:utf 8 -*-

diccionario = {'a':'aa', 'b':'ab', 'c':'ac', 'd':'ad', 'e':'ae',
              'f':'ba', 'g':'bb', 'h':'bc', 'i':'bd', 'j':'bd',
              'k':'be', 'l':'ca', 'm':'cb', 'n':'cc',
              'o':'cd', 'p':'ce', 'q':'da', 'r':'db', 's':'dc', 't':'dd',
              'u':'de', 'v':'ea', 'w':'eb', 'x':'ec', 'y':'ed', 'z':'ee'}

def cifrar():
   texto = input ("Palabra a cifrar: ").lower()                                

   textoleet = ''
   for v in texto:
       if v in diccionario.keys():
           textoleet += diccionario[v]
       else:
           textoleet += v
   print(textoleet)

def descifrar():
   texto = input ("Palabra a descifrar: ").lower()                                
   textoleet = ''
   inicio= 0
   final = 2
   while inicio < len(texto) :
       v=texto[inicio:final]
       inicio+=2
       final+=2
       for g,w in diccionario.items():
           if w == v:
               textoleet+= g
   print(textoleet)  



cifrar()
descifrar()


seguramente hay formas mejores pero es la que se me ocurrió primero. otra cosa, revisa tu diccionario porque la n y la ñ tienen el mismo valor, por eso para simplificar saqué la ñ del mio.

jam man

Bueno la cuestión con la "Ñ" es de que tiene la misma coordenada que la "N", lo mismo pasa con la "J" y con la "I", esto de acuerdo a la tabla del cifrado polybios:

https://infow.wordpress.com/2008/11/13/criptografia-clasica-ii-polybios/

y al momento de descifrar ya es cuestión del usuario interpretarlo.

Y muchas gracias!!! Supongo que es lo mismo pero con coordenadas números.