@Bobrenok_kola

Как получить верный результат в расшифровке?

Пишу шифровльшик в функции расшифровки неправильный вывод. Функция шифрования и дешифрования
def encrypt(msg):
		key=[]
		new_msg=[]
		alphabet = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
		ind= 0
		while True:
			rannd = random.randint(0,52)
			key.append(rannd)
			letter = msg[ind]
			alphabet.index(letter)
			letter = alphabet[(alphabet.index('Z') + rannd) % len(alphabet)]
			new_msg.append(letter)
			ind+=1
			if ind >=len(list(msg)):
				break
			
		print ("Зашифрованное сообщение:")
		print(new_msg)
		print('Коюч:')
		print(key)
#Расшифровать сообщение

	def decipher(msg,key):
		alphabet = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
		ind = 0
		new_msg=[]
		while True:
			keynumber = key[ind]
			letter = msg[ind]
			#new_index = (alphabet.index(letter) - number) % len(alphabet)
			new_index = alphabet[(alphabet.index(letter) - keynumber) ]
			new_msg.append(new_index)
			ind+=1
			if ind >=len(list(msg)):
				break
		print ("Исходное сообщение:")
		print(new_msg)

Вывод программы
Что вам нужно?1
Исходное сообщение:hello
Зашифрованное сообщение:
['i', 'n', 'd', 'O', 'y']
Коюч:
[9, 14, 4, 41, 25]
______________________________
Зашифровать - 1
Расшифровать - 2
Сгенерировать пароль - 3
Выйти - 0
______________________________
Что вам нужно?2
Зашифрованное сообщение:indOy            
Вводите ключ по числам, если ключ введен впишите число 111
Цифрка ключа 0 :9
Цифрка ключа 1 :14
Цифрка ключа 2 :4
Цифрка ключа 3 :41
Цифрка ключа 4 :25
Цифрка ключа 5 :111
[9, 14, 4, 41, 25]
Если ваш ключ введен верно впишите y/n:y
Исходное сообщение:
['Z', 'Z', 'Z', 'Z', 'Z']
______________________________
  • Вопрос задан
  • 146 просмотров
Решения вопроса 1
@dmshar
Вы так и будете бегать с форума на форум, с каждой новой ошибкой в своей программе?
Вчера я вам подсказал, в чем у вас ошибка, сегодня вы не справились со следующей. Пора бы научиться самому искать ошибки в своих скриптах, а не жить на подсказках.
Так вы никогда программирование не осилите.

Я уже не говорю о том, шифруя сообщения и создавая одновременно ключ для расшифровки - вы должны их оба передавать читателю. Причем, ключ той-же длины, что и само сообщение. Круто! Ладно, сообщение отправили по e-mail. А ключ как будете передавать - голубиной почтой или курьером? Это фундаментальная ошибка.

А техническая - вы так и не разобрались, где и что у вас индексируется.
Вот вам пища для размышления - решение вашей задачи (в той постановке, какую вы задали). Попробуйте разобраться сами что и как тут работает.
def encrypt(msg):
    key = []
    new_msg = []
    alphabet = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ !?.,")
    ind = 0
    while True:
        rannd = random.randint(0, 52)
        key.append(rannd)
        ab_temp = alphabet[rannd:] + alphabet[:rannd]
        new_msg.append(ab_temp[alphabet.index(msg[ind])])
        ind += 1
        if ind >= len(list(msg)):
            break
    print("Зашифрованное сообщение:")
    print(new_msg)
    print('Ключ:')
    print(key)

def decipher(msg, key):
    alphabet = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ !?.,")
    ind = 0
    new_msg = []
    while True:
        ab_temp = alphabet[key[ind]:] + alphabet[:key[ind]]
        new_msg.append(alphabet[ab_temp.index(msg[ind])])
        ind += 1
        if ind >= len(list(msg)):
          break
    print("Исходное сообщение:")
    print(new_msg)


Шифруем:
encrypt('Hello world')
Зашифрованное сообщение:
['X', 'K', 'w', 'M', 'M', 'f', 'n', 'w', 'j', 'O', 'T']
Ключ:
[16, 32, 11, 27, 24, 10, 48, 8, 49, 29, 42]


Расшифровываем:
decipher(['X', 'K', 'w', 'M', 'M', 'f', 'n', 'w', 'j', 'O', 'T'], [16, 32, 11, 27, 24, 10, 48, 8, 49, 29, 42])
Исходное сообщение:
['H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
SoreMix
@SoreMix Куратор тега Python
yellow
Не люблю криптографию, но по-моему ошибка в функции шифровки. "Ключ", по сути, является просто индексами букв из зашифрованного сообщения и никак не связан с оригиналом. Все сдвиги получены от рандомного числа, которое нигде не сохраняется, и как мне кажется это эквивалентно
crypto_msg = random.choices(alphabet, len(msg))
Где msg - сообщение, которое нужно зашифровать.

Могу ошибаться
Ответ написан
@dodo512
['Z', 'Z', 'Z', 'Z', 'Z']

Так получилось потому что в цикле шифровали alphabet.index('Z') + rannd, а не буквы исходного сообщения alphabet.index(letter) + rannd

letter = alphabet[(alphabet.index(letter) + rannd) % len(alphabet)]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы