Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2021, 17:09   #1
Kris_Str
 
Регистрация: 29.01.2021
Сообщений: 4
По умолчанию Шифрование и Дешифрование (шифр Цезаря)

Код:
from tkinter import *
llst = ['а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х',
        'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я']
blst = ['г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о ',
        'п', 'р', 'с ', 'т', 'у', 'ф', 'х ', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'а', 'б', 'в']


def coding(shift=3):
    x = el.get()
    if x not in llst:
        l3.config(text="Нет такого(их) символа(ов)")
    else:
        ind = llst.index(x) + shift
        if ind > 32:
            cods = llst[ind - 33]
            l3.config(text="Результат-" + cods)
        else:
            cods = llst[ind]
            l3.config(text="результат-" + cods)


def uncoding(shift=3):
    x = el1.get()
    if x not in blst:
        l31.config(text="Нет такого(их) символа(ов)")
    else:
        ind = blst.index(x) - shift
        if ind > 32:
            cods = blst[ind - 33]
            l31.config(text="Результат-" + cods)
        else:
            cods = blst[ind]

        l31.config(text="Результат-" + cods)


root = Tk()
root.geometry('500x300')
root.title("")

ll = Label(root, text="Шифр Цезаря", fg="black")
ll.place(x=40, y=0)

l2 = Label(root, text="Введите символы ", fg="black")
l2.place(x=0, y=30)

el = Entry(root, width=50)
el.place(x=100, y=30)

l3 = Label(root, text="Результат:", fg="blue")
l3.place(x=0, y=60)

b1 = Button(root, text="Закодировать", command=coding)
b1.place(x=60, y=90)

ll1 = Label(root, text="Дешифрование", fg="black")
ll1.place(x=150, y=150)

l21 = Label(root, text="Введите символы ", fg="black")
l21.place(x=0, y=180)

el1 = Entry(root, width=50)
el1.place(x=100, y=180)

l31 = Label(root, text="Результат:", fg="blue")
l31.place(x=0, y=210)

b11 = Button(root, text="Дешифровать", command=uncoding)
b11.place(x=60, y=240)

root.mainloop()
Но при запуске слова не получается ввести можно только один символ, как сделать так чтобы можно было вводить слова

Последний раз редактировалось BDA; 29.01.2021 в 17:21.
Kris_Str вне форума Ответить с цитированием
Старый 29.01.2021, 18:10   #2
VeryStupidPerson
Пользователь
 
Аватар для VeryStupidPerson
 
Регистрация: 20.07.2020
Сообщений: 69
По умолчанию

Можно добавить ещё одну функцию, которая будет разбивать строку на символы, их передавать по одному на шифровку/дешифровку, затем результат преобразовывать в строку и выдавать обратно. (разбить строку на символы можно просто преобразовав в список (команда list()).
---------------------------------------------------
Нич-чего не понимаю!
Или что-то случилось, или… одно из двух!
VeryStupidPerson вне форума Ответить с цитированием
Старый 29.01.2021, 22:47   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

1. Кодирование и декодирование - это из области преобразования информации, а шифрование и дешифрование - это из области криптографии. Шифр Цезаря - оттуда же.
Т.е. функции, на мой взгляд, можно назвать как encryption и decryption.

2. Не очень понятно назначение двух списков со сдвигом на 3 позиции и передача величины сдвига в функции. Если передавать в функцию величину сдвига, то достаточно и одного списка.
Если использовать готовые списки (без сдвига и со сдвигом), то в функции ничего можно и не передавать.
Определяешь позицию символа в одном списке и достаёшь элемент из другого списка.

3. Про шифрование строки уже сказано, но думаю, что новой функции создавать не надо, поскольку исходное значение получается из поля:
Код:
x = el.get()
Думаю, что в простом цикле
Код:
for i in range(len(x)):
можно достать все символы.
Получил символ. Получил его позицию (индекс) в первом списке (шифрование) и с этим индексом извлекаешь символ из второго списка.
При дешифровании поступаешь так же, только ищешь символ во второй строке, и по его индексу, достаёшь символ из первого списка.

4. Но можно и поиграться.
Например, сгенерировать ключ. Ключ - это набор чисел, которые задают сдвиг.
Вводишь ключ в отдельное поле. Читаешь очередное число из ключа, делаешь сдвиг исходного списка и используешь новый список для шифрования/дешифрования. Так поступаешь со всеми символами сообщения. Ключ может быть и небольшим. Только в том случае, когда перебор значений ключа заканчивается, используешь этот ключ повторно.
Важно, что ничего никуда добавлять не надо (см. как у тебя добавляется тройка).
Достаточно проверять символы на допустимость.
Символ, если он отсутствует в списке, можно просто повторить или заменить случайным из исходного списка. Так думаю, что при дешифровании посторонних символов не должно быть, но и там можно поступать аналогично.
Это с тем, что бы не добавлять лишних сообщений.
Просто зашифровал или дешифровал.

Для сдвига списка предлагаю такую функцию (придумал не сам. Нашёл в Сети и очень рад ей):
Код:
# Сдвиг символов строки влево или вправо
# leftShifts - число сдвигов влево - 0 -:- n
# rightShifts число сдвигов вправо - 0 -:- m
# Пример: getShiftedString('123456', 3, 7)
# Ответ:  345612

def getShiftedString(s, leftShifts, rightShifts):
    i = (leftShifts - rightShifts) % len(s)
    return s[i:] + s[:i]

L = getShiftedString('123456', 3, 7)
print(L)
PS: Вот пример функций без второго списка.
Параметр shift оставил для случая работы с ключом.
Код:
def encription(shift = 3):
    x = el.get()
    cods = ''
    for i in range(len(x)):
        if x[i] not in llst:
            cods += x[i]
        else:
            ind = llst.index(x[i])
            cods += llst[(ind + shift) % len(llst)]
    l3.config(text="Результат-" + cods)

def decription(shift = 3):
    x = el1.get()
    cods = ''
    for i in range(len(x)):
        if x[i] not in blst:
            cods += x[i]
        else:
            ind = llst.index(x[i])
            cods += llst[(ind - shift) % len(llst)]
    l31.config(text="Результат-" + cods)
Как-то так, ...

Последний раз редактировалось ViktorR; 29.01.2021 в 23:31.
ViktorR вне форума Ответить с цитированием
Старый 30.01.2021, 10:08   #4
Kris_Str
 
Регистрация: 29.01.2021
Сообщений: 4
По умолчанию

Спасибо, очень помогли
Kris_Str вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифр Цезаря Exalted Python 16 30.08.2018 11:20
Шифр Цезаря Ти6ка C# (си шарп) 7 21.02.2017 22:19
Шифр цезаря microlab Паскаль, Turbo Pascal, PascalABC.NET 2 19.01.2014 18:41
Шифр Цезаря Jasper92 Помощь студентам 3 02.12.2009 18:47