Cifrado de César usando python, podría usar un poco de ayuda

Estoy tratando de hacer un “Cifrado de César” mientras uso python … esto es lo que tengo hasta ahora. ¿Alguien podría decirme cómo se ve esto? ¿Voy en la dirección correcta? ¿Qué me estoy perdiendo? Cuando ejecuto el progtwig para decir, por ejemplo (josh es genial), no obtengo el cifrado en la misma línea. Se ve así cuando hago main(3)

 m r v k l v f r r o 

Pero pone cada letra en una nueva línea. ¿Cómo podría hacerlo para que esté en una línea?

 def main(k): if k231: print "complaint" raise SystemExit Input = raw_input("Please enter Plaintext to Cipher") for x in range(len(Input)): letter=Input[x] if letter.islower(): x=ord(letter) x=x+k if x>122: x=x-122+97 print chr(x), if letter.isupper(): x=ord(letter) x=x+k if x>90: x=x-90+65 print chr(x), 

Me gusta la respuesta de kaizer.se, pero creo que puedo simplificarla usando la función string.maketrans :

 import string first = raw_input("Please enter Plaintext to Cipher: ") k = int(raw_input("Please enter the shift: ")) shifted_lowercase = ascii_lowercase[k:] + ascii_lowercase[:k] translation_table = maketrans(ascii_lowercase, shifted_lowercase) print first.translate(translation_table) 

Este código debería funcionar bastante bien. También maneja compensaciones arbitrarias, incluyendo negativas.

 phrase = raw_input("Please enter plaintext to Cipher: ") shift = int(raw_input("Please enter shift: ")) result = '' for char in phrase: x = ord(char) if char.isalpha(): x = x + shift offset = 65 if char.islower(): offset = 97 while x < offset: x += 26 while x > offset+25: x -= 26 result += chr(x) print result 

La otra forma de hacerlo, con un cifrado ligeramente diferente, es simplemente rotar a través de todos los caracteres, superior e inferior, o incluso todo ascii> 0x20.

 phrase = raw_input("Please enter plaintext to Cipher: ") shift = int(raw_input("Please enter shift: ")) result = '' for char in phrase: x = ord(char) x = x + shift while x < 32: x += 96 while x > 127: x -= 96 result += chr(x) print result 

Ponga una coma después de cada statement impresa; todavía pondrá un espacio entre los caracteres, pero todos estarán en la misma línea. Si necesita imprimirlos sin espacios, compártelos todos en una sola cadena e imprímalos al final.

Aquí hay un método diferente para mostrar cómo podemos manejar esto de una manera muy limpia. Definimos un alfabeto de entrada y un alfabeto de salida, luego una tabla de traducción y usamos unicode.translate() para realizar el cifrado real.

 import string # Blatantly steal Lennart's UI design first = unicode(raw_input("Please enter Plaintext to Cipher: "), "UTF-8") k = int(raw_input("Please enter the shift: ")) in_alphabet = unicode(string.ascii_lowercase) out_alphabet = in_alphabet[k:] + in_alphabet[:k] translation_table = dict((ord(ic), oc) for ic, oc in zip(in_alphabet, out_alphabet)) print first.translate(translation_table) 

Puede extenderse a letras mayúsculas según sea necesario.

Salvo los errores de syntax, su código parece funcionar.

Sin embargo, me tomé la libertad de eliminar todos los duplicados y limpiarlos:

 first = raw_input("Please enter Plaintext to Cipher: ") k = int(raw_input("Please enter the shift: ")) result = '' for second in first: x=ord(second) x=x+k if x>90 and x<122: x=x-26 elif x>122: x=x-26 result += chr(x) print first print result 

También “primero” y “segundo” son nombres realmente malos para esas variables. “Entrada” y “letra” es probablemente mejor.

Yo muy simple, la solución de 3 turnos sin Umlauts y por igual sería:

 def caesar(inputstring): shifted=string.lowercase[3:]+string.lowercase[:3] return "".join(shifted[string.lowercase.index(letter)] for letter in inputstring) 

y revertir:

 def brutus(inputstring): shifted=string.lowercase[-3:]+string.lowercase[:-3] return "".join(shifted[string.lowercase.index(letter)] for letter in inputstring) 

usándolo:

 caesar("xerxes") 

Para Python 3.3, intente usar las funciones ord (), chr () y .isalpha:

 m = input("What is your message?: ") s = int(input("What is the shift?: ")) for i in m: if i.isalpha(): if (ord(i)+s)>90: print(chr(ord(i)+s-26),end=""), elif chr(ord(i)+s-26)<65: print("The shift is invalid") else: print(chr(ord(i)+s),end=""), else: pass 

Aquí hay un oneliner.

 >>> brutus=lambda message,cipher,direction:''.join([chr((ord(letter)+(cipher*direction))%256) for letter in message]) >>> encrypted= brutus('Message to be encrypted',14,1) #direction=1 for encryption >>> encrypted '[s\x81\x81ous.\x82}.ps.s|q\x80\x87~\x82sr' >>> brutus(encrypted,14,-1) # direction=-1 for decryption 'Message to be encrypted' >>>