2016-05-11 4 views
-4

Я пытаюсь сделать шифр Vigenere в python. Я нашел в Интернете какой-то код, который я собирался работать, поскольку это было тяжело. Когда я запускаю этот код:Vigenere Cipher - Не указывая буквы

plaintext = "HELLO WORLD" 
keyword = "KEYKEYKEYKEY" 
encoded = "" 

for c in range(len(plaintext)): 
    char = ord(plaintext[c]) 
    temp = ord(keyword[c]) 
    newchar = char + temp 
    if newchar > ord("Z"): 
     newchar -= 26 
    newnewchar = chr(newchar) 
    encoded += newnewchar 

print(repr(encoded)) 

Он печатает это:

'yp\x8b}z_\x88z\x91}o' 

я ожидал только английские буквы. Любая идея, что может быть неправильным?

+2

Я редактировал свой вопрос и код, чтобы люди могли быстро увидеть, что они должны знать, вместо того, чтобы открыть Pastebin ссылку, скопируйте код на свой компьютер, запустите его и введите вход, который может быть или не воспроизвести проблему. Я также вырезал часть кода, который работал, чтобы читать было не так. Обратите внимание: вот как задать вопрос о StackOverflow. Представьте, насколько это проще для читателей. –

ответ

2

Попробуйте PyCharm и научитесь использовать отладчик. Выполнение кода в нем Выявлена ​​проблема очень легко:

enter image description here

(Выделенная линия, где в настоящее время код, следовательно, newchar == 121 == 72 + 75 - 26)

Даже без PyCharm, урок в том, что, когда вам нужно выясните проблему в коде, найдите способ увидеть, какие значения на каждом этапе проверяют ваши предположения. Самый простой способ - вставить print(...) всюду.

+2

Как сказал мой учитель, когда вы просили о помощи с отладкой, «сначала добавьте инструкции для печати, чтобы искать вещи, которые не имеют смысла. Если вы все еще не можете найти проблему, тогда придите ко мне» – PMARINA

1

Более путинским способом было бы использовать списки;

plaintext = 'THISISAPLAINTEXT' 
key = 'SPAMEGGS' 
count = int(len(plaintext)/len(key))+1 

stretchedkey = [ord(c) for c in key*count] 

# Encryption 
plainnum = [ord(c) for c in plaintext] 
ciphernum = [a+b-65 for a, b in zip(plainnum, stretchedkey)] 
ciphertext = ''.join([chr(c) if c <= 90 else chr(c-26) for c in ciphernum]) 

# Decryption 
ciphernum = [ord(c) for c in ciphertext] 
decryptnum = [a-b+65 for a, b in zip(ciphernum, stretchedkey)] 
decrypt = ''.join([chr(c) if c >= 65 else chr(c+26) for c in decryptnum]) 

Показаны шаги в IPython;

In [1]: plaintext = 'THISISAPLAINTEXT' 

In [2]: key = 'SPAMEGGS' 

In [3]: count = int(len(plaintext)/len(key))+1 

In [4]: stretchedkey = [ord(c) for c in key*count] 

In [5]: plainnum = [ord(c) for c in plaintext] 

In [6]: plainnum 
Out[6]: [84, 72, 73, 83, 73, 83, 65, 80, 76, 65, 73, 78, 84, 69, 88, 84] 

In [7]: ciphernum = [a+b-65 for a, b in zip(plainnum, stretchedkey)] 

In [8]: ciphernum 
Out[8]: [102, 87, 73, 95, 77, 89, 71, 98, 94, 80, 73, 90, 88, 75, 94, 102] 

In [9]: ciphertext = ''.join([chr(c) if c <= 90 else chr(c-26) for c in ciphernum]) 

In [10]: ciphertext 
Out[10]: 'LWIEMYGHDPIZXKDL' 

In [11]: ciphernum = [ord(c) for c in ciphertext] 

In [12]: decryptnum = [a-b+65 for a, b in zip(ciphernum, stretchedkey)] 

In [13]: decryptnum 
Out[13]: [58, 72, 73, 57, 73, 83, 65, 54, 50, 65, 73, 78, 84, 69, 62, 58] 

In [14]: decrypt = ''.join([chr(c) if c >= 65 else chr(c+26) for c in decryptnum]) 

In [15]: decrypt 
Out[15]: 'THISISAPLAINTEXT'