2015-11-03 6 views
-1

У меня возникли проблемы с шифрованием прописных букв, например. если сообщение COMPUTING FUN, ключевым словом является GCSE, я должен получить JRFUBWBSN LL KBQ, но мой фактический результат - xftipkpgb zz ype. Этот результат не имеет правильных букв и не является капиталом. Любая помощь приветствуетсяШифрование писем верхнего регистра python vigenere

    message = input('\nenter message: ') 
        keyword = input('enter keyword: ') 
        def chr_to_inta(char): 
         return 0 if char == 'Z' else ord(char)-64 
        def int_to_chra(integer): 
         return 'Z' if integer == 0 else chr(integer+64) 
        def add_charsa(msg, key): 
         return int_to_chr((chr_to_int(msg) + chr_to_int(key)) % 26) 


        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(msg, key): 
         return int_to_chr((chr_to_int(msg) + chr_to_int(key)) % 26) 

        def vigenere(message, keyword): 

         keystream = cycle(keyword) 
         new = '' 
         for msg in message: 
          if msg == ' ': # adds a space 
           new += ' ' 
          elif 96 < ord(msg) < 123: # if lowercase 
           new += add_chars(msg, next(keystream)) 

          else: # if uppercase 
           new += add_charsa(msg, next(keystream)) 

         return new 

        new = vigenere(message, keyword) 
        print('your encrypted message is: ',new) 
+2

мы уже техника его подводит это сделать ... Http: //stackoverflow.com/questions/33442220/itertools-cycle-in-vigenere- cipher-cause-problems-with-spaces-python/33442864 # 33442864 –

+0

Мы добавили пробелы в прошлый раз, теперь мне нужно сделать заглавные буквы. Я попробовал добавить три новые функции, похожие на другие, но теперь они возвращают прописную букву «Z», а не в нижнем регистре, это не сработало, и я застрял в идеях – MrBeard

+0

, во-первых, у вас есть два определения 'add_chars' и никаких определений' add_charsa'. во-вторых, вам нужно убедиться, что 'add_charsa' вызывает ваши новые функции, а не ваши старые, то есть он должен« возвращать int_to_chra ((chr_to_inta (msg) + chr_to_inta (key))% 26) ' –

ответ

0

, так как вы не кажется, чтобы получить то, что я хочу сказать:

def add_charsa(msg, key): 
    return int_to_chr((chr_to_int(msg) + chr_to_int(key)) % 26) 

является то, что вы в настоящее время. с этим, вы получите ваш плохой выход:

>>> vigenere('COMPUTING IS FUN','GCSE') 
'xftipkpgb zz ype' 

Это потому, что вы не изменили оператор возврата для этой функции для вызова новых прописные функций. если изменить оператор возврата к:

def add_charsa(msg, key): 
    return int_to_chra((chr_to_inta(msg) + chr_to_inta(key)) % 26) 
#notice the change in function calls from int_to_chr -> int_to_chra, and chr_to_int -> chr_to_inta 

вы тогда получите ожидаемый:

>>> vigenere('COMPUTING IS FUN','GCSE') 
'JRFUBWBSN LL KBQ' 

Это стоит того, чтобы знать, что если ваш ключ имеет сочетание верхнего и нижнего регистра, это не будет работать. очень хорошо. я бы вместо того, чтобы изменить keystream быть: keystream = cycle(keyword.lower()) тогда ваша функция будет:

def add_charsa(msg, key): 
     return int_to_chra((chr_to_inta(msg) + chr_to_int(key)) % 26) 
    #notice the call to chr_to_int(key) because key will always be lower case 
+0

oops, я чувствую себя немного глупо сейчас. большое спасибо – MrBeard

Смежные вопросы