Problema en script para cifrar [Python]

Iniciado por nohate, 15 Julio 2013, 14:00 PM

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

nohate

Buenas!
Estoy intentando hacer un script bastante simple para cifrar en Python (siguiendo el método del Cifrado César), éste es el código.

def crypt(text,x):
    abc = "abcdefghijklmnopqrstuvwxyz"
    text = text.lower()
    for i in range (0,len(text)):
        n = abc.find(text[i])
        if n<0:
            text = text.replace(text[i],text[i])
        if n>=0:
            text = text.replace(text[i],abc[(n+x)%len(abc)])
    text = text.upper()                               
    return text


El problema aparece si por ejemplo intento hacer crypt('hola',4). Lo que hace el script es cambiar la h por una l, y luego cuando llega a la l de la palabra hola cambia las dos eles. Por esa misma razón si intento cifrar un escrito de una medida considerable al final acaba sustituyéndolo todo por la misma letra. He intentado buscar otros ejemplos en python de criptografia pero la mayoría de scripts son más complejos que este. Me gustaría saber si hay alguna forma de fijar una posición una vez ya ha sido modificada una vez, de hacer que no pueda cambiar dos veces.

Muchísimas gracias, un saludo!

Eleкtro

#1
Estás reemplazando el caracter en todo el texto.

Tenemos la palabra "hello", y lo que hace tu script es esto:
- Replace "h" por "l" en todo el texto, resultado: "lello"
Ahí se puede ver cláramente que al llegar a las otras dos "ll" va a haber un conflicto porque también vas a reemplazar la primera "l".

Solución: No hagas diréctamente las modificaciones sobre el argumento "text", o usa replace para reemplazar un caracter en X posición del texto, pero no el caracter en el texto entero.

Código (python) [Seleccionar]
def crypt(text,x):
   abc = "abcdefghijklmnopqrstuvwxyz"
   newtext = ""
   for i in range (0,len(text.lower())):
       n = abc.find(text[i])
       if n<0:
           newtext = newtext + text[i]
       if n>=0:
        newtext = newtext + abc[(n+x)%len(abc)]
   return newtext.upper()


Saludos








nohate

No se me había pasado por la cabeza hacerlo de esa forma, la verdad Ö. Muchísimas gracias por la ayuda! ^^