Шифр цезаря с ключевым словом и криптоаналитическая атака
есть код который правильно шифрует слово по цезарю с ключевым словом но и надо сделать для дешифровку ,сделал с помощью криптоаналитической атаки,вроде всё реализовал правильно и взял у друга пример,у него все работает а у меня проблема с размерностью не могу понять почему
IndexError: list index out of range в 63 строке ошибка LetterSwap = []
for i in range(len(EngAlphabet)):
LetterSwap.append([EngAlphabet[i][0], CryptAlphabet[i][0]])
в этом цикле
from random import *
import string
Alphalist = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
file = open('текст для теса.txt', 'r')
startMessage = file.read().upper()
startMessage = startMessage.translate(str.maketrans(' ', ' ', string.punctuation)) # избавились от знаков препинания
print("Текст для зашифровки:", startMessage)
numberkey = int(input('Отступ: '))
key=[Alphalist[randint(0,len(Alphalist))-1]for i in range(1,len(Alphalist))]
key=set(key)
key=''.join(list(key))
print('Ключевое слово:',key)
def remove(alpha, string):
for symbol in string:
if symbol not in [chr(x) for x in range(65, 91)] \
or string.count(symbol) > 1: string.remove(symbol)
if symbol in alpha: alpha.remove(symbol)
return alpha, string
def insert(alpha_string):
for index, symbol in enumerate(alpha_string[1]):
alpha_string[0].insert((numberkey + index) % 26, symbol)
return alpha_string[0]
def encryptDecrypt( message, keyy,final=""):
alpha = insert(remove(Alphalist, key))
print(alpha)
for symbol in message:
final += alpha[(alpha.index(symbol) + keyy) % 26]
return final
def encryptDecrypt1( message, keyy,final1=""):
alpha = insert(remove(Alphalist, key))
print(alpha)
for symbol in message:
final1 += alpha[(alpha.index(symbol) - keyy) % 26]
return final1
message = encryptDecrypt( startMessage, numberkey)
print("Final", message)
EngAlphabet = [[' ', 0.185], ['e', 0.097], ['t', 0.076], ['a', 0.064], ['o', 0.062], ['n', 0.057], ['i', 0.056],
['s', 0.052], ['r', 0.047], ['h', 0.04], ['l', 0.031], ['d', 0.028], ['c', 0.025], ['u', 0.018],
['p', 0.018], ['f', 0.018], ['m', 0.017], ['w', 0.016], ['y', 0.015], ['b', 0.013], ['g', 0.013],
['v', 0.007], ['k', 0.0039], ['q', 0.002], ['x', 0.002], ['j', 0.001], ['z', 0.001]]
CryptAlphabet = []
for i in set(''.join(list(message))):
CryptAlphabet.append([i, message.count(i) / len(message)])
for i in range(len(CryptAlphabet) - 1):
for j in range(len(CryptAlphabet) - i - 1):
if CryptAlphabet[j][1] < CryptAlphabet[j + 1][1]:
CryptAlphabet[j], CryptAlphabet[j + 1] = CryptAlphabet[j + 1], CryptAlphabet[j]
LetterSwap = []
for i in range(len(EngAlphabet)):
LetterSwap.append([EngAlphabet[i][0], CryptAlphabet[i][0]])
Run = True
while Run:
EncryptWord = ""
for letter in message:
for i in LetterSwap:
if letter == i[1]:
EncryptWord += i[0]
break
print('расшифрованный текст:', EncryptWord)
Ответы (1 шт):
Автор решения: Эникейщик
→ Ссылка
В списке длиной i отсутствует элемент [i]. Замените на EngAlphabet[i-1] и CryptAlphabet[i-1]. А ещё лучше используйте словарь, а не список.