Test Foro de elhacker.net SMF 2.1

Programación => Scripting => Mensaje iniciado por: jam man en 13 Octubre 2015, 00:07 AM

Título: Invertir una función en Python.
Publicado por: jam man en 13 Octubre 2015, 00:07 AM
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.
Título: Re: Invertir una función en Python.
Publicado por: tincopasan en 13 Octubre 2015, 16:23 PM
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
Título: Re: Invertir una función en Python.
Publicado por: jam man en 14 Octubre 2015, 03:10 AM
si es para una materia de Seguridad Informática.
Título: Re: Invertir una función en Python.
Publicado por: tincopasan en 14 Octubre 2015, 09:36 AM
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.
Título: Re: Invertir una función en Python.
Publicado por: jam man en 14 Octubre 2015, 14:44 PM
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.