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

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Не люблю криптографию, но по-моему ошибка в функции шифровки. "Ключ", по сути, является просто индексами букв из зашифрованного сообщения и никак не связан с оригиналом. Все сдвиги получены от рандомного числа, которое нигде не сохраняется, и как мне кажется это эквивалентно
    crypto_msg = random.choices(alphabet, len(msg))
    Где msg - сообщение, которое нужно зашифровать.

    Могу ошибаться
    Ответ написан
    1 комментарий
  • Как получить верный результат в расшифровке?

    @dodo512
    ['Z', 'Z', 'Z', 'Z', 'Z']

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

    letter = alphabet[(alphabet.index(letter) + rannd) % len(alphabet)]
    Ответ написан
    Комментировать
  • Как получить верный результат в расшифровке?

    @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']
    Ответ написан
    Комментировать
  • Как нормально реализовать форму регистрации на Python + Tkinter?

    @o5a
    первое в регистрации при попытке ввести данные получает странную ошибку

    Потому что с именами путаница. Например, в reg используются элементы entryEPASS а на проверку передаются entryPASS.
    авторизации проверка логина проходит успешно, а абсолютно эдентичная проверка пароля ставит систему в тупик

    У вас там проверка вообще странная, ищете логин среди всех, затем пароль среди всех, а если совпадают так уходите в бесконечный цикл.
    И вообще, у Вас логины отвязаны от паролей, совпадение покажет даже для несовпадающих пар логин:пароль, даже если они просто есть в данных. Для нормальной проверки нужно хранить их попарно, например в виде словаря logins = {"логин1": "пароль1", ...}
    Правильнее было бы сделать проверку (используя ваши же переменные name, p) и вышеуказанный словарь
    if logins.get(name) == p:
    сразу проверит, что введенные логин и пароль совпадают.

    И саму проверку пароля лучше не привязывать к элементам интерфейса. Сделать функцию, просто принимающую готовые строки (логин, пароль) и выдающую результат проверки. А в эти функции передавать уже строки из нужных элементов интерфейса: entryPASS.get() и т.п.
    Ответ написан
    Комментировать