2016-02-13 2 views
0

Я пытаюсь написать приложение vigenere в Python. Вот как приложение должно работать:Vigenere Cypher в Python

  1. запустить программу
  2. введите «1» для шифрования или «2» для дешифрования сообщения
  3. введите ваш шифровать ключ
  4. введите вход открытый текст файл, который вы хотите зашифровать/расшифровать
  5. введите выходной файл, где теперь зашифровано/расшифрован текст будет сохранен

шифровальщик ключом является строкой альфа-Numeri c chars, которые затем преобразуются в int, и это число используется для поворота простого текста в cypher-text. Например: A или a поверните одну букву вправо, чтобы зашифровать или одну букву влево, чтобы расшифровать.

Практически все работает нормально. Если я введу текстовый файл на английском языке, зашифруйте его, а затем расшифруйте этот файл с помощью того же ключа, выходной файл должен выглядеть ТОЧНО, как файл с открытым текстом, с которого я начал ... и это происходит, за исключением строк новой строки , Некоторые оригинальные новые строки исчезли, и несколько новых были выбраны для хорошей оценки.

Я провел много времени, пытаясь понять, что я делаю неправильно. Буду признателен за любую помощь. Вот полный код:

# ask user if he/she wishes to encrypt or decrypt a message 
pmode = 0 
while True: 
    try: 
     pmode = int(input("Enter 1 to encrypt or 2 to decrypt a message: ")) 
     while pmode not in {1, 2}: 
      int(input("Oops! Please enter 1 or 2: ")) 
      break 
     break 
    except (ValueError, NameError): 
     print("Oops! That entry is not supported, try again...") 

# ask user for a cypher keyword 
key = input("Enter codeword: ") 

# create list to store converted key 
keylength = len(key) 
realkey = [] * keylength 

# convert "key" from string of chars to string of ints 
for i in key: 
    if i.isalpha(): 
     if i.isupper(): 
      realkey.append(ord(i) % ord('A') + 1) 
     elif i.islower(): 
      realkey.append(ord(i) % ord('a') + 1) 
    elif ord(i) >= 48 and ord(i) <=57: 
     realkey.append(int(i)) 
    else: 
     realkey.append(0) 

# prompt user for input file and open it 
infile_name = input("Enter input file name: ") 
infile = open(infile_name, 'r') 

# prompt user for output file and open it 
outfiler_name = input("Enter output file name: ") 
outfile = open(outfiler_name, "w") 

# if on encryption mode, encrypt 
if pmode == 1: 
    # iterate over inmessage and rotate (within ASCII chars 32 - 126) using realkey 
    indx = -1 
    # loop over infile, encrypt and write to outfile 
    while True: 
     # temp variable to store current char 
     char = infile.read(1) 
     indx += 1 
     # stop when EOF is reached 
     if not char: 
      break 
     else: 
      if ord(char) + realkey[indx % keylength] > 126: 
       outfile.write(chr((ord(char) - 126 + realkey[indx % keylength]))) 
      else: 
       outfile.write(chr((ord(char) + realkey[indx % keylength]))) 
else: 
    # iterate over inmessage and rotate (within ASCII chars 32 - 126) using realkey 
    indx = -1 
    # loop over infile, encrypt and write to outfile 
    while True: 
     # temp variable to store current char 
     char = infile.read(1) 
     indx += 1 
     # stop when EOF is reached 
     if not char: 
      break 
     else: 
      if ord(char) + realkey[indx % keylength] < 32: 
       outfile.write(chr((ord(char) + 126 - realkey[indx % keylength]))) 
      else: 
       outfile.write(chr((ord(char) - realkey[indx % keylength]))) 

# close files 
infile.close() 
outfile.close() 

Спасибо.

ответ

0

потому \n (перевод строки) является ASCII 10 так что помните Ord ('\ п') == 10

у вас есть 2 возможности в этой точке

  1. ord(char) + realkey[indx % keylength] < 32:
    • обычно имеет значение, за исключением тех случаев, когда ord(key_letter)-ord('a') >= 22
    • если его истинное значение (для слова 'a' (значение real_key 1), то 126 + 10 + 1 = 137 (или '\x89')
    • теперь, когда мы пытаемся расшифровать его позже снова же key_letter
      • Ord ('\ x89') == 137
      • поэтому наш, если заявление ord(char) + realkey[indx % keylength] < 32: ложно
      • мы будем использовать наше другое правило декодировать его 89 - 1, хорошо, что определенно не получает нас к 10, и таким образом это расшифровал строку неправильно
  2. или его нет, этот случай еще хуже ...

Я думаю, что ваш алгоритм будет разбит во многих случаях ... и должен быть полностью реорганизован ....Я дам вам некоторые указатели на рефакторинг, которые помогут сделать его более проверяемым для вас

  • при тестировании жёстко вашего ключа key="Yellow55"
  • также жёстка вашей строки для шифрования и дешифрования, убедитесь, что он имеет некоторые более сложные символы пользователя (например, новые строки) my_string="Hello\nTest\t\rString\r\n" ... действительно было бы разумно использовать string.printable, так как это должно включать все буквы ascii в качестве тестового примера ...
  • функции использования ... Я не могу это подчеркнуть !!!

Функции
def decrypt(string_to_decrypt,key): 
    #do your stuff 
def encrypt(string_to_encrypt,key): 
    #do your stuff 
  • Вместо while True: i+=1 ... вы должны использовать for i,value in enumerate(my_list):

  • печати вещи ... много ... Я имею в виду на самом деле ... распечатать все это будет почти всегда делайте свою ошибку очень очевидной.

    если вы не можете подключиться nt все для somereason, то, по крайней мере, использовать отладчик

+0

Это очень помогает. Я вижу, что моя ошибка заключается не только в отсутствии 'ord ('\ n') == 10', но у меня серьезные проблемы с дизайном. Спасибо! – Henry

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

  • Нет связанных вопросов^_^