2015-11-04 2 views
-1

В настоящее время выполняется шифрование Vigenere в Python, и я и многие люди в моем классе застряли в одном аспекте.Добавление некоторых чисел в строку/список, а затем преобразование в буквы

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

Input = input('Enter your message: ') 

key = input('Enter the one word key: ') 

times = len(Input)//len(key)+1 

encryptedKey = (times*key)[:len(Input)] 

output = [] 
for character in Input: 
    number = ord(character) - 96 
    output.append(number) 

outputKey = [] 
for character in encryptedKey: 
     numberKey = ord(character) - 96 
     outputKey.append(numberKey) 

print(encryptedKey) 

print(outputKey) 
print(Input) 
print(output) 

Так, если вход 'hello', и ключ 'bye', ключевое слово станет 'byeby'[2,25,5,2,25] и 'hello' бы [8,5,12,12,15]. Я не могу найти способ добавить первый 2 с 8, 25 с 5 и так далее.

Я пробовал print(sum(output + outputKey)), но, конечно, это просто добавляет все числа вместе, то есть ответ 111.

Мне также нужно, чтобы они вернулись в буквы, так что это заканчивается зашифрованным сообщением.

Спасибо!

+0

Почему бы не a: for i in len (keyword): loop? – ergonaut

+1

Я подозреваю, что вы хотите 'zip' ... – jonrsharpe

+0

@idjaw Во всяком случае, это не дубликат этого вопроса. Фокус на подобном элементе Vigenere - это модульная арифметика, даже если OP этого еще не осознает. – BlivetWidget

ответ

0

Вы на правильном пути. Вы получили свое сообщение и ключ, переведенный в цифры.

keyphrase = [2,25,5,2,25] 
message = [8,5,12,12,15] 

Теперь вам нужно добавить их и по модулю 26, чтобы ваши ответы по-прежнему были a-z.

encrypted = [(keyphrase[i] + message[i])%26 for i in range(len(message))] 
>>> encrypted 
[10, 4, 17, 14, 14] 

Теперь вам нужно повернуть их обратно в буквы:

''.join(chr(c + 96) for c in encrypted) 
'jdqnn' 

И тогда вы можете восстановить сообщение, перейдя в другую сторону:

message = [(encrypted[i] - keyphrase[i])%26 for i in range(len(encrypted))] 
>>> message 
[8, 5, 12, 12, 15] 
>>> ''.join(chr(c + 96) for c in message) 
'hello' 

Немного FYI, для компьютерной криптографии, особенно с языком, подобным Python или C, обычно стандартно начинать подсчет в 0. Так что «a» равно 0, «b» равно 1 и т. д. Вы начинаете с 1, что хорошо, просто осознавая это.

+0

Спасибо, супер полезно. Теперь мне просто нужно выяснить, как убедиться, что символы не шифруются! Все еще привыкнуть к использованию .isalpha! – AnimeDeamon

+0

@AnimeDeamon '.isalpha()' может наверняка получить вас туда, куда вы хотите отправиться. Если вы хотите мой совет, я бы не только «не шифровал» символы, я бы уничтожил их из сообщения, прежде чем вы его зашифровали. В любой реальной криптосистеме вы хотите зашифровать все, что вы отправляете, что означает либо шифрование знаков препинания, либо (в случае шифрования Vigenere, которое работает только с буквами), оставив его. Оставляя их, но не зашифрованные, выдает много информации. – BlivetWidget

+0

Моя учительница сказала, хотя я понимаю, что я должен сделать ее более простой, чтобы ей было легче понять, поставив ее в несколько строк. Я пробовал, но это как-то испортило остальную часть моей кодировки. – AnimeDeamon

0

Вы также можете попробовать что-то вроде этого (псевдокод):

int j = 0 
for int i = 0; i < output.len(); i++ 
    print output[i] + outputKey[j] 
    j++ 
    if j > outputKey.len() 
     j = 0 

Таким образом, вместо того, расширить массив из [б, у, е] в [б, у, е, б, у] вы вычисляете ключ один раз и используете его индекс для перебора дополнительных значений по мере необходимости.