Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: nohate en 15 Julio 2013, 14:00 pm



Título: Problema en script para cifrar [Python]
Publicado por: nohate en 15 Julio 2013, 14:00 pm
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.

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!


Título: Re: Problema en script para cifrar [Python]
Publicado por: Eleкtro en 15 Julio 2013, 15:35 pm
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
  1. def crypt(text,x):
  2.    abc = "abcdefghijklmnopqrstuvwxyz"
  3.    newtext = ""
  4.    for i in range (0,len(text.lower())):
  5.        n = abc.find(text[i])
  6.        if n<0:
  7.            newtext = newtext + text[i]
  8.        if n>=0:
  9.         newtext = newtext + abc[(n+x)%len(abc)]
  10.    return newtext.upper()

Saludos


Título: Re: Problema en script para cifrar [Python]
Publicado por: nohate en 15 Julio 2013, 17:13 pm
No se me había pasado por la cabeza hacerlo de esa forma, la verdad Ö. Muchísimas gracias por la ayuda! ^^