2015-07-09 5 views
-1

Я хочу получить определенные значения из цикла for, чтобы добавить к другой строке, чтобы создать шифр vigenere.vigenere cipher - не добавляя правильных значений

вот код.

userinput = input('enter message') 
keyword = input('enter keyword') 
new = '' 
for a in keyword: 
    pass 
for i in (ord(x) for x in userinput): 
    if 96 < i < 123: #lowercase 
     new += chr(97 + (i+ord(a)-97)#keeps all values in alphabet 
print(new) 

поэтому ответ я хочу, если я делаю «ABCD» как мое сообщение и «AB» как мое ключевое слово желаемый результат «bddf» как «а» + «а» «Ъ» и «б '+' b '=' d 'и т. д., как бы я изменил код, чтобы он соответствовал моему желаемому результату, или мне придется полностью его изменить и как я буду это делать.

+1

http://stackoverflow.com/questions/tagged/vigenere+python –

ответ

0

попробовать это (вам не хватает mod 26 -часть):

from itertools import cycle 

plaintext = input('enter message: ') 
keyword = input('enter keyword: ') 

def chr_to_int(char): 
    return 0 if char == 'z' else ord(char)-96 
def int_to_chr(integer): 
    return 'z' if integer == 0 else chr(integer+96) 
def add_chars(a, b): 
    return int_to_chr((chr_to_int(a) + chr_to_int(b)) % 26) 

def vigenere(plaintext, keyword): 
    keystream = cycle(keyword) 
    ciphertext = '' 
    for pln, key in zip(plaintext, keystream): 
     ciphertext += add_chars(pln, key) 
    return ciphertext 

ciphertext = vigenere(plaintext, keyword) 
print(ciphertext) 

, если вам нравится списковых, вы также можете написать

def vigenere(plaintext, keyword): 
    keystream = cycle(keyword) 
    return ''.join(add_chars(pln, key) 
        for pln, key in zip(plaintext, keystream)) 

UPDATE

обновляется в соответствии с желание a+a=b. обратите внимание, что z в этом случае является нейтральным элементом для добавления (z+char=z).

+0

он отлично работает, когда я меняю 97 на 96. Можете ли вы добавить комментарии, пожалуйста, – MrBeard

+0

обновлен. спасибо за исправление. и обратите внимание на специальный случай для 'z'. –