import tkinter as tk
from tkinter import ttk
from tkinter import * 

def Info():
    inf_Window = Toplevel(root)
    inf_Window.title("СПРАВКА")
    inf_Window.minsize(width = 357, height = 300)
    inf_Window.maxsize(width = 357, height = 300)
    inf_Window = Label(inf_Window, fg = "pale goldenrod", bg = "black", font = "Verdana 15", justify = LEFT, text = '       Программа-шифровальщик\n Данная программа реализует\n \
алгоритмы шифрования:\n - cдвиг Цезаря\n - шифр Атбаш \n - шифр Виженера\n - квадрат Плейфера\n - метод Полибия \n Работу выполнил ученик\n 9 "А" класса гимназии №261\n Олег Владимирович Ярославский.\n Программа написана в 2023 году.')
    inf_Window.pack()

    
def Caesar():
    
    def reference_Ceasar():
        info_Caesar = Toplevel(root_Ceasar)
        info_Caesar.title("СПРАВКА")
        info_Caesar.minsize(width = 601, height = 300)
        info_Caesar.maxsize(width = 601, height = 300)
        info_Caesar = Label(info_Caesar, fg = "pale goldenrod", bg = "black", font = "Verdana 15", justify = LEFT, text = "                      СПРАВКА - СДВИГ ЦЕЗАРЯ\nСдвиг Цезаря – один из самых древних шифров \nV – IV веков до н. э. Шиф\
р назван в честь римского\nимператора Гая Юлия Цезаря. При шифровании\nкаждый символ заменяется другим, стоящим\nот него в алфавите на k число позиций.\n\nАлгоритм шифрует русские и английские буквы, цифры.\nОстальные символы (.,!?*\& и д\
р.) не шифруются.\nШифр Цезаря имеет простую реализацию; но его легко\nвзломать, просто перебрав все возможные значения\nсдвигов (ведь их не больше, чем букв в алфавите).") 
        info_Caesar.pack()
    def set_color_info_Caesar(event):
        event.widget.config(bg = 'grey20')
    def restore_color_info_Caesar(event):
        event.widget.config(bg = 'grey11')
    
    def Shifr():    #функция зашифровки
        message = vvod_Text_Ceasar.get(1.0, END)     #взятие слов
        sdvig = int(sdvig_Vod_Ceasar.get(1.0, END))  #взятие сдвига
        s = ""
        stroka = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяабвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ012345678901234567890123456789012345678901234567890123456789'
        itog = str("")         #ВЫШЕ а-я А-Я a-z A-Z 0-9
        while message[len(message)-1] == " ":
            message = message[:-1]
        for i in message:
            mesto = stroka.find(i)
            newmesto = mesto + sdvig
            if i in stroka:  #для букв и цифр
                itog += stroka[newmesto]
            else:            #для необычных символов
                itog += i
        vuvod_Text_Ceasar.insert(1.0, itog + "\n")#вывод
        

    def DeShifr():  #функция расшифровки
        message = vvod_Text_Ceasar.get(1.0, END)    #взятие слов
        sdvig = int(sdvig_Vod_Ceasar.get(1.0, END)) #взятие сдвига
        stroka = '012345678901234567890123456789012345678901234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюяабвгдеёжзийклмнопрстуфхцчшщъыьэюя'
        itog = str("")         #ВЫШЕ а-я А-Я a-z A-Z 0-9
        while message[len(message)-1] == " ":
            message = message[:-1]
        for i in message:
            mesto = stroka.rfind(i)
            newmesto = mesto - sdvig
            if i in stroka:  #для букв и цифр
              itog += stroka[newmesto]
            else:            #для необычных символов
              itog += i
        vuvod_Text_Ceasar.insert(1.0, itog + "\n")#вывод

    root_Ceasar = Tk() #создание окна
    root_Ceasar.title("ШИФРОВАЛЬЩИК - СДВИГ ЦЕЗАРЯ") #название окна
    root_Ceasar.geometry("800x800")
    root_Ceasar.minsize(width = 800, height = 800)  #устанавливаем размер окна
    root_Ceasar.maxsize(width = 800, height = 800)

    pole1_Ceasar = Frame(root_Ceasar, width = 190, height = 130, bd = 5, bg = "cyan2") 
    pole1_Ceasar.pack() #создание поля1 в окне, выбираем ширину, высоту, цвет

    lab1_Ceasar = Label(pole1_Ceasar, fg = "pale goldenrod", text = "Введите шаг", bg = "black", width = 100, font = "Verdana 15" )
    lab1_Ceasar.pack() #создание в поле1 надписи  "Введите шаг", цвет поля, шрифт

    sdvig_Vod_Ceasar = Text(pole1_Ceasar, width = 100, fg = "yellow", font = "Verdana 15", bg = "black", height = 1)
    sdvig_Vod_Ceasar.pack() #создание в поле1 текстого поля, куда вводят шаг

    lab2_Ceasar = Label(pole1_Ceasar, fg = "pale goldenrod", text = "Введите сообщение", bg = "black", width = 70, font = "Verdana 15" )
    lab2_Ceasar.pack() #создание надписи "Введите сообщение", цвет поля и надписи, шрифт

    vvod_Text_Ceasar = Text(pole1_Ceasar, height = 9, width = 50, fg = "azure", font = "Verdana 20", bg = "black", wrap="word")
    vvod_Text_Ceasar.pack() #создание текстого поля, куда вводят слова сообщения

    pole2_Ceasar = Frame(root_Ceasar, width = 190, height = 100, bd = 5, bg = "cyan2")
    pole2_Ceasar.pack() #создание нового поля2 в окне

    knopka_Shifr_Ceasar = Button(pole2_Ceasar, command = Shifr, text = "Зашифровать", fg = "yellow", font = "Verdana 15", width = 30, height = 2,  bg = "grey11")
    knopka_Shifr_Ceasar.grid(row = 0, column = 0) #создание в поле2 кнопки1

    knopka_Deshifr_Ceasar = Button(pole2_Ceasar, command = DeShifr, text = "Расшифровать", fg = "yellow", font = "Verdana 15", width = 29, height = 2,  bg = "grey11")
    knopka_Deshifr_Ceasar.grid(row = 0, column = 1) #создание в поле2 кнопки2

    pole3_Ceasar = Frame(root_Ceasar, width = 190, height = 130, bd = 5, bg = "cyan2")
    pole3_Ceasar.pack() #создание поля 3 в окне

    vuvod_Text_Ceasar = Text(pole3_Ceasar, height = 12, width = 50, fg = "azure", font = "Verdana 20", bg = "black", wrap="word")
    vuvod_Text_Ceasar.pack() #создание текстого поля, где выводится итог

    info_Caesar = Button(pole1_Ceasar, command = reference_Ceasar, text = "i", fg = "yellow", font = "Verdana 15", bg = "grey11", width = 2, height = 1)
    info_Caesar.place(x = 749, y = 5)
    info_Caesar.bind('<Enter>', set_color_info_Caesar)
    info_Caesar.bind('<Leave>', restore_color_info_Caesar)

    root_Ceasar.mainloop() 

    
def Atbash():
    
    def reference_Atbash():
        info_Atbash = Toplevel(root_Atbash)
        info_Atbash.title("СПРАВКА")
        info_Atbash.minsize(width = 621, height = 280)
        info_Atbash.maxsize(width = 621, height = 280)
        info_Atbash = Label(info_Atbash, fg = "pale goldenrod", bg = "black", font = "Verdana 15", justify = LEFT, text = '                      СПРАВКА - ШИФР АТБАШ \nШифр Атбаша – это шифр простой замены, впе\
рвые\nиспользованный для еврейского алфавита VI - XIV н.э. \nШифрование происходит заменой первой буквы алфавита\nна последнюю, второй на предпоследнюю и т.д.\n\nАлгоритм шифрует русские и английские буквы, цифр\
ы.\nОстальны\е символы (.,!?*\& и др.) не шифруются.\nЭтот шифр является одним из самых простых, его очень \nлегко разгадать; очень прост в реализации.\nОбъем зашифрованных данных не изменяется.')
        info_Atbash.pack()

    def set_color_info_Atbash(event):
        event.widget.config(bg = 'grey20')
    def restore_color_info_Atbash(event):
        event.widget.config(bg = 'grey11')
        
    def Shifr():    #функция зашифровки
        message = vvod_Text_Atbash.get(1.0, END)     #взятие слов
        stroka   = '.,?!+-="%;№@ :\|/$#абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
        newstroka ='$#-+= |\"/%?!№@:;,.яюэьыъщшчцхфутсрпонмлкйизжёедгвбаЯЮЭЬЫЪЩШЧЦХФУТСРПОНМЛКЙИЗЖЁЕДГВБАzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA9876543210'
        itog = str("")
        while message[len(message)-1] == " ":
            message = message[:-1]
        for i in message:
            mesto = stroka.find(i)
            if i in stroka:  #для букв и цифр
              itog += newstroka[mesto]
            else:            #для необычных символов
                    itog += i
        vuvod_Text_Atbash.insert(1.0, itog + "\n")#вывод



    def DeShifr():  #функция расшифровки
        message = vvod_Text_Atbash.get(1.0, END)    #взятие слов
        stroka   = '.,?!+-="%;№@ :\|/$#абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
        newstroka ='$#-+= |\"/%?!№@:;,.яюэьыъщшчцхфутсрпонмлкйизжёедгвбаЯЮЭЬЫЪЩШЧЦХФУТСРПОНМЛКЙИЗЖЁЕДГВБАzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA9876543210'
        itog = str("")
        while message[len(message)-1] == " ":
            message = message[:-1]
            
        for i in message:
            mesto = newstroka.find(i)
            if i in stroka:  #для букв и цифр
              itog += stroka[mesto]
            else:            #для необычных символов
              itog += i
        vuvod_Text_Atbash.insert(1.0, itog + "\n")#вывод


    
    root_Atbash = Tk() #создание окна
    root_Atbash.title("ШИФРОВАЛЬЩИК - ШИФР АТБАШ") #название окна
    root_Atbash.geometry("800x800")
    root_Atbash.minsize(width = 800, height = 800)  #устанавливаем размер окна
    root_Atbash.maxsize(width = 800, height = 800)

    pole1_Atbash = Frame(root_Atbash, width = 190, height = 130, bd = 5, bg = "cyan2") 
    pole1_Atbash.pack() #создание поля1 в окне, выбираем ширину, высоту, цвет

    lab_Atbash = Label(pole1_Atbash, fg = "pale goldenrod", text = "Введите сообщение", bg = "black", width = 70, font = "Verdana 15" )
    lab_Atbash.pack() #создание надписи "Введите сообщение", цвет поля и надписи, шрифт

    vvod_Text_Atbash = Text(pole1_Atbash,height = 9, width = 50, fg = "azure", font = "Verdana 20", bg = "black", wrap="word")
    vvod_Text_Atbash.pack() #создание текстого поля, куда вводят слова сообщения

    pole2_Atbash = Frame(root_Atbash, width = 190, height = 100, bd = 5, bg = "cyan2")
    pole2_Atbash.pack() #создание нового поля2 в окне

    knopkaShifr_Atbash = Button(pole2_Atbash, command = Shifr, text = "Зашифровать", fg = "yellow", font = "Verdana 15", width = 30, height = 2, bg = "grey11")
    knopkaShifr_Atbash.grid(row = 0, column = 0) #создание в поле2 кнопки1

    knopka_Deshifr_Atbash = Button(pole2_Atbash, command = DeShifr, text = "Расшифровать", fg = "yellow", font = "Verdana 15", width = 29, height = 2, bg = "grey11")
    knopka_Deshifr_Atbash.grid(row = 0, column = 1) #создание в поле2 кнопки2

    pole3_Atbash = Frame(root_Atbash, width = 190, height = 130, bd = 5, bg = "cyan2")
    pole3_Atbash.pack() #создание поля 3 в окне

    vuvod_Text_Atbash = Text(pole3_Atbash, height = 12, width = 50, fg = "azure", font = "Verdana 20", bg = "black", wrap="word")
    vuvod_Text_Atbash.pack() #создание текстого поля, где выводится итог

    info_Atbash = Button(pole1_Atbash, command = reference_Atbash, text = "i", fg = "yellow", font = "Verdana 15", bg = "grey11",width = 2, height = 1)
    info_Atbash.place(x = 749, y = 5)
    info_Atbash.bind('<Enter>', set_color_info_Atbash)
    info_Atbash.bind('<Leave>', restore_color_info_Atbash)

    root_Atbash.mainloop()
    

def Vigenere():
    def reference_Vigenere():
        info_Vigenere = Toplevel(root_Vigenere)
        info_Vigenere.title("СПРАВКА")
        info_Vigenere.minsize(width = 591, height = 330)
        info_Vigenere.maxsize(width = 591, height = 330)
        info_Vigenere = Label(info_Vigenere, fg = "pale goldenrod", bg = "black", font = "Verdana 15", justify = LEFT, text = '                СПРАВКА - ШИФР ВИЖЕНЕРА\nШифр Виженера – это метод шифрования  текста \nс использованием кодового слова. \nНазванный именем францу\
зского дипломата XVI века, \nон был изобретен независимо друг от друга разными\nлюдьми. Что интересно, Блеза Виженера при этом\nсреди них не было, он лишь убедил Генриха III\nиспользовать его. Название шифр получил в XIX веке.\n\nДля работы алгоритма нужно кодовое слово. \nПри ши\
фровании n-ная буква сообщения заменяется \nна символ, стоящий на k позиций правее, \nгде k – место в алфавите n-ной буквы в кодовом слове.')
        info_Vigenere.pack()

    def set_color_info_Vigenere(event):
        event.widget.config(bg = 'grey20')
    def restore_color_info_Vigenere(event):
        event.widget.config(bg = 'grey11')

    def Shifr():    #функция зашифровки
        message = vvod_Text_Vigenere.get(1.0, END)     #взятие слов
        message = message.lower()
        message = message.replace("\n"," ")
        kod = vvod_Kod_Vigenere.get(1.0, END)         #взятие кодового слова
        kod = kod.lower()
        stroka = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяабвгдеёжзийклмнопрстуфхцчшщъыьэюabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmn.,?!:;()%$#@ "\-0123456789.,?!:;()%$#@ "\-0123456789.,?!:;()%$#@ "\-0123456789'
        strokaru = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
        strokaen = 'abcdefghijklmnopqrstuvwxyz'
        itog = str("")
        dlina = 0

        while message[len(message)-1] == " ":
            message = message[:-1]
        
        for i in message:
        
            while dlina > int(len(message)):
                dlina -= 1           
            if int(len(kod)) < int(len(message)) and dlina == int(len(kod))-1:
                dlina = 0
            
            if i in stroka:
                    n = str(kod [dlina] )
                    
                    if n in strokaru:
                        sdvig = strokaru.find(n)                        
                        mesto = stroka.find(i)
                        newmesto = mesto + sdvig
                        itog += stroka[newmesto]
                        dlina += 1
                    elif n in strokaen:
                        sdvig = strokaen.find(n)                        
                        mesto = stroka.find(i)
                        newmesto = mesto + sdvig
                        itog += stroka[newmesto]
                        dlina += 1
            else:            
                    itog += i
                
        vuvod_Text_Vigenere.insert(1.0, itog + "\n\n")

    def DeShifr():  #функция расшифровки
        message = vvod_Text_Vigenere.get(1.0, END)     #взятие слов
        kod = vvod_Kod_Vigenere.get(1.0, END)         #взятие кодового слова
        stroka = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяабвгдеёжзийклмнопрстуфхцчшщъыьэюabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmn.,?!:;()%$#@ "\-0123456789.,?!:;()%$#@ "\-0123456789.,?!:;()%$#@ "\-0123456789'
        strokaru = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
        strokaen = 'abcdefghijklmnopqrstuvwxyz'
        itog = str("")
        dlina = 0
        while message[len(message)-1] == " ":
            message = message[:-1]
            
        for i in message:
            
            while dlina > int(len(message)):
                dlina -= 1           
            if int(len(kod)) < int(len(message)) and dlina == int(len(kod))-1:
                dlina = 0
                           
            if i in stroka:                
                n = str(kod [dlina] )
                
                if n in strokaru:
                        sdvig = strokaru.find(n)                        
                        mesto = stroka.rfind(i)
                        newmesto = mesto - sdvig
                        itog += stroka[newmesto]
                        dlina += 1
                elif n in strokaen:
                        sdvig = strokaen.find(n)                        
                        mesto = stroka.rfind(i)
                        newmesto = mesto - sdvig
                        itog += stroka[newmesto]
                        dlina += 1
            else:            
                    itog += i
        
        vuvod_Text_Vigenere.insert(1.0, itog + "\n\n")

        
    root_Vigenere = Tk() #создание окна
    root_Vigenere.title("ШИФРОВАЛЬЩИК - ШИФР ВИЖЕНЕРА") #название окна
    root_Vigenere.geometry("800x800")
    root_Vigenere.minsize(width = 800, height = 800)  #устанавливаем размер окна
    root_Vigenere.maxsize(width = 800, height = 800)

    pole1_Vigenere = Frame(root_Vigenere, width = 190, height = 130, bd = 5, bg = "cyan2") 
    pole1_Vigenere.pack() #создание поля1 в окне, выбираем ширину, высоту, цвет

    lab1_Vigenere = Label(pole1_Vigenere, fg = "pale goldenrod", text = "Введите кодовое слово", bg = "black", width = 100, font = "Verdana 15" )
    lab1_Vigenere.pack() #создание в поле1 надписи  "Введите кодовое слво", цвет поля, шрифт

    vvod_Kod_Vigenere = Text(pole1_Vigenere, width = 100, fg = "yellow", font = "Verdana 15", bg = "black", height = 1, wrap = "word")
    vvod_Kod_Vigenere.pack() #создание в поле1 текстого поля, куда вводят шаг

    lab2_Vigenere = Label(pole1_Vigenere, fg = "pale goldenrod", text = "Введите сообщение", bg = "black", width = 70, font = "Verdana 15" )
    lab2_Vigenere.pack() #создание надписи "Введите сообщение", цвет поля и надписи, шрифт

    vvod_Text_Vigenere = Text(pole1_Vigenere, height = 9, width = 50, fg = "azure", font = "Verdana 20", bg = "black", wrap = "word")
    vvod_Text_Vigenere.pack() #создание текстого поля, куда вводят слова сообщения

    pole2_Vigenere = Frame(root_Vigenere, width = 190, height = 100, bd = 5, bg = "cyan2")
    pole2_Vigenere.pack() #создание нового поля2 в окне

    knopka_Shifr_Vigenere = Button(pole2_Vigenere, command = Shifr, text = "Зашифровать", fg = "yellow", font = "Verdana 15", width = 30, height = 2, bg = "grey11")
    knopka_Shifr_Vigenere.grid(row = 0, column = 0) #создание в поле2 кнопки1

    knopka_Deshifr_Vigenere = Button(pole2_Vigenere, command = DeShifr, text = "Расшифровать", fg = "yellow", font = "Verdana 15", width = 29, height = 2, bg = "grey11")
    knopka_Deshifr_Vigenere.grid(row = 0, column = 1) #создание в поле2 кнопки2

    pole3_Vigenere = Frame(root_Vigenere, width = 190, height = 130, bd = 5, bg = "cyan2")
    pole3_Vigenere.pack() #создание поля 3 в окне

    vuvod_Text_Vigenere = Text(pole3_Vigenere, height = 12, width = 50, fg = "azure", font = "Verdana 20", bg = "black", wrap = "word")
    vuvod_Text_Vigenere.pack() #создание текстого поля, где выводится итог

    info_Vigenere = Button(pole1_Vigenere, command = reference_Vigenere, text = "i", fg = "yellow", font = "Verdana 15", bg = "grey11", width = 2, height = 1)
    info_Vigenere.place(x = 749, y = 5)
    info_Vigenere.bind('<Enter>', set_color_info_Vigenere)
    info_Vigenere.bind('<Leave>', restore_color_info_Vigenere)

    root_Vigenere.mainloop()  


def Playfair():
    def reference_Playfair():
        info_Playfair = Toplevel(root_Playfair)
        info_Playfair.title("СПРАВКА")
        info_Playfair.minsize(width = 565, height = 355)
        info_Playfair.maxsize(width = 565, height = 355)
        info_Playfair = Label(info_Playfair, fg = "pale goldenrod", bg = "black", font = "Verdana 15", justify = LEFT, text = '           СПРАВКА - КВАДРАТ ПЛЕЙФЕРА\nВ начале 1850-х гг. Чарльз Уитстон пр\
идумал\nтак называемый «прямоугольный шифр».\nЛеон Плейфер, его близкий друг, рассказал об этом\nшифре во время встречи министру внутренних дел \nлорду Пальмерстону.\n\nДля шифрования создается кодовое сло\
во \nи таблица - русская 4x8, английская 5x5. \nТаблица заполняется сначала кодом, а затем\nостальными буквами. Повторяющиеся буквы\nв таблице удаляются. Далее сообщение разбивается \nпо две буквы, котор\
ые шифруются в зависимости от\nих положения в таблице.')
        info_Playfair.pack()

    def set_color_info_Playfair(event):
        event.widget.config(bg = 'grey20')
    def restore_color_info_Playfair(event):
        event.widget.config(bg = 'grey11')
        
    def Shifr():    #функция зашифровки
        message = vvod_Text_Playfair.get(1.0, END)     #взятие слов
        message = message.lower()
        message1 = ""
        kod = vvod_Kod_Playfair.get(1.0, END)#взятие кодового слова
        kod = kod.lower()
        itog = str("")
        stroka = 'абвгдежзийклмнопрстуфхцчшщъыьэюя0123456789.,!?:; &%#"-+$'
        strok = (str(kod[:-1])+ str(stroka))
        stroka = ''
        special, mestosp = [], []
        count = 0               

                
        for i in range(len(strok)):
                if stroka.find(strok[i]) == -1: # удаление одинаковых символов в матрице
                    stroka += strok[i]

        message = message.lower()

        message = message.replace("\n"," ")
        while message[len(message)-1] == " ":
            message = message[:-1]
            
        for i in range(0, len(message)):
            if message[i] in stroka:
                message1 += message[i]
            else:
                special += [message[i]]
                mestosp += [count]
            count+=1
    
           
        message = message1
        message1 = ""
        

        if (len(message))%2 == 1:  # добавление в конец сообщения я
            message += "я"
        print(message)
        countDub = 0

        
        for i in range(0, len(message), 2):
            if message[i] == message[i+1]:
                message1 = message1 + message[i]+ "яя" + message[i+1] # разделение одинаковых символов
                countDub += 2
            else:
               message1 = message1 + message[i] + message[i+1]
               
        message = message1
        
        for i in range(0, len(message),2):      #шифровка
            mesto1 = stroka.find(message[i])
            mesto2 = stroka.find(message[i+1])
            #столбец
            if  mesto1%8 == mesto2%8: 
                if mesto1 + 8 >= 56:
                    mesto1 = mesto1 - 56
                if mesto2 + 8 >= 56:
                    mesto2 = mesto2 - 56
                itog = itog + stroka[mesto1 + 8] + stroka[mesto2 + 8]
            #строка
            elif (0 <= mesto1 < 8 and 0 <= mesto2 < 8 ) or (8 <= mesto1 < 16 and 8 <= mesto2 < 16)\
            or (16 <= mesto1 < 24 and 16 <= mesto2 < 24) or (24 <= mesto1 < 32 and 24 <= mesto2 < 32)\
            or (32 <= mesto1 < 40 and 32 <= mesto2 < 40) or (40 <= mesto1 < 48 and 40 <= mesto2 < 48)\
            or (48 <= mesto1 < 56 and 48 <= mesto2 < 56):
                if mesto1+1 == 8 or mesto1+1 == 16 or mesto1+1 == 24 or mesto1+1 == 32 or mesto1+1 == 39\
                or mesto1+1 == 48 or mesto1+1 == 56:
                    mesto1 = mesto1 - 8
                if mesto2+1 == 8 or mesto2+1 == 16 or mesto2+1 == 24 or mesto2+1 == 32 or mesto2+1 == 39\
                or mesto2+1 == 48 or mesto2+1 == 56:
                    mesto2 = mesto2 - 8
                itog = itog + stroka[mesto1+1] + stroka[mesto2+1]
            #квадрат   
            else:
                if ((0 <= mesto1 < 8 and 8 <= mesto2 < 16) or (8 <= mesto1 < 16 and 16 <= mesto2 < 24)\
                or (16 <= mesto1 < 24 and 24 <= mesto2 < 32) or (32 <= mesto1 < 40 and 40 <= mesto2 < 48)\
                or (40 <= mesto1 < 48 and 48 <= mesto2 < 56) or (0 <= mesto2 < 8 and 8 <= mesto1 < 16)\
                or (8 <= mesto2 < 16 and 16 <= mesto1 < 24) or (16 <= mesto2 < 24 and 24 <= mesto1 < 32)\
                or (32 <= mesto2 < 40 and 40 <= mesto1 < 48) or (40 <= mesto2 < 48 and 48 <= mesto1 < 56)):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 8] + stroka[mesto1 + 8]
                    else:
                        itog = itog + stroka[mesto2 + 8] + stroka[mesto1 - 8]
                        
                if (0 <= mesto1 < 8 and 16 <= mesto2 < 24) or (8 <= mesto1 < 16 and 24 <= mesto2 < 32)\
                or (24 <= mesto1 < 32 and 40 <= mesto2 < 48) or (32 <= mesto1 < 40 and 48 <= mesto2 < 56)\
                or (0 <= mesto2 < 8 and 16 <= mesto1 < 24) or (8 <= mesto2 < 16 and 24 <= mesto1 < 32)\
                or (24 <= mesto2 < 32 and 40 <= mesto1 < 48) or (32 <= mesto2 < 40 and 48 <= mesto1 < 56):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 16] + stroka[mesto1 + 16]
                    else:
                        itog = itog + stroka[mesto2 + 16] + stroka[mesto1 - 16]
                        
                if (0 <= mesto1 < 8 and 24 <= mesto2 < 32) or (8 <= mesto1 < 16 and 32 <= mesto2 < 40)\
                or (16 <= mesto1 < 24 and 40 <= mesto2 < 48) or (24 <= mesto1 < 32 and 48 <= mesto2 < 56)\
                or (0 <= mesto2 < 8 and 24 <= mesto1 < 32) or (8 <= mesto2 < 16 and 32 <= mesto1 < 40)\
                or (16 <= mesto2 < 24 and 40 <= mesto1 < 48) or (24 <= mesto2 < 32 and 48 <= mesto1 < 56):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 24] + stroka[mesto1 + 24]
                    else:
                        itog = itog + stroka[mesto2 + 24] + stroka[mesto1 - 24]

                if (0 <= mesto1 < 8 and 32 <= mesto2 < 40) or (8 <= mesto1 < 16 and 40 <= mesto2 < 48)\
                or (16 <= mesto1 < 24 and 48 <= mesto2 < 56) or (0 <= mesto2 < 8 and 32 <= mesto1 < 40)\
                or (8 <= mesto2 < 16 and 40 <= mesto1 < 48)or (16 <= mesto2 < 24 and 48 <= mesto1 < 56):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 32] + stroka[mesto1 + 32]
                    else:
                        itog = itog + stroka[mesto2 + 32] + stroka[mesto1 - 32]

                if (0 <= mesto1 < 8 and 40 <= mesto2 < 48) or (8 <= mesto1 < 16 and 48 <= mesto2 < 56)\
                or (0 <= mesto2 < 8 and 40 <= mesto2 < 48) or (8 <= mesto2 < 16 and 48 <= mesto1 < 56):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 40] + stroka[mesto1 + 40]
                    else:
                        itog = itog + stroka[mesto2 + 40] + stroka[mesto1 - 40]

                if ( 0<= mesto1 < 8 and 47 <= mesto2 < 56) or (0 <= mesto2 < 8 and 48 <= mesto1 < 56):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 48] + stroka[mesto1 + 48]
                    else:
                        itog = itog + stroka[mesto2 + 48] + stroka[mesto1 - 48]

               
        itog2 = ''
        count = 0
        if mestosp != []:
            for i in range(0, len(itog)):
                
                if i == mestosp[count]:
                    
                    itog2 = itog2 + special[count] + itog[i]
                    
                    if count < len(mestosp)-1:
                        count += 1
                        
                else:
                    itog2 += itog[i]
                    
            itog = itog2
            
        vuvod_Text_Playfair.insert(1.0, itog + "\n\n")


     
    def DeShifr():  #функция расшифровки
        message = vvod_Text_Playfair.get(1.0, END)     #взятие слов
        message = message.lower()
        message1 = ""
        kod = vvod_Kod_Playfair.get(1.0, END)#взятие кодового слова
        kod = kod.lower()
        itog = str("")
        stroka = 'абвгдежзийклмнопрстуфхцчшщъыьэюя0123456789.,!?:; &%#"-+$'
        strok = (str(kod[:-1])+ str(stroka))
        stroka = ''
        special, mestosp = [], []
        count = 0               
        
        for i in range(len(strok)):
                if stroka.find(strok[i]) == -1:
                    stroka += strok[i]

        message = message.replace("\n"," ")
        while message[len(message)-1] == " ":
            message = message[:-1]

        
        for i in range(0, len(message)):
            if message[i] in stroka:
                message1 += message[i]
            else:
                special += [message[i]]
                mestosp += [count]
            count += 1

                
        message = message1
        message1 = ""    

        for i in range(0, len(message),2):
            mesto1 = stroka.find(message[i])
            mesto2 = stroka.find(message[i+1])
            #столбец
            if  mesto1%8 == mesto2%8: 
                if mesto1 - 8 < 0:
                    mesto1 = mesto1 + 56
                if mesto2 - 8 < 0:
                    mesto2 = mesto2 + 56
                itog = itog + stroka[mesto1 - 8] + stroka[mesto2 - 8]
                
            elif (0 <= mesto1 < 8 and 0 <= mesto2 < 8 ) or (8 <= mesto1 < 16 and 8 <= mesto2 < 16)\
            or (16 <= mesto1 < 24 and 16 <= mesto2 < 24) or (24 <= mesto1 < 32 and 24 <= mesto2 < 32)\
            or (32 <= mesto1 < 40 and 32 <= mesto2 < 40) or (40 <= mesto1 < 48 and 40 <= mesto2 < 48)\
            or (48 <= mesto1 < 56 and 48 <= mesto2 < 56):
                if mesto1-1 == -1 or mesto1-1 == 7 or mesto1-1 == 15 or mesto1-1 == 23 or mesto1-1 == 31\
                or mesto1-1 == 39 or mesto1-1 == 47:
                    mesto1 = mesto1 + 8
                if mesto2-1 == -1 or mesto2-1 == 7 or mesto2-1 == 15 or mesto2-1 == 23 or mesto2-1 == 31\
                or mesto2-1 == 39 or mesto2-1 == 47:
                    mesto2 = mesto2 + 8
                itog = itog + stroka[mesto1-1] + stroka[mesto2-1]
                
            #квадрат   
            else:
                 
                if ((0 <= mesto1 < 8 and 8 <= mesto2 < 16) or (8 <= mesto1 < 16 and 16 <= mesto2 < 24)\
                or (16 <= mesto1 < 24 and 24 <= mesto2 < 32) or (32 <= mesto1 < 40 and 40 <= mesto2 < 48)\
                or (40 <= mesto1 < 48 and 48 <= mesto2 < 56) or (0 <= mesto2 < 8 and 8 <= mesto1 < 16)\
                or (8 <= mesto2 < 16 and 16 <= mesto1 < 24) or (16 <= mesto2 < 24 and 24 <= mesto1 < 32)\
                or (32 <= mesto2 < 40 and 40 <= mesto1 < 48) or (40 <= mesto2 < 48 and 48 <= mesto1 < 56)):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 8] + stroka[mesto1 + 8]
                    else:
                        itog = itog + stroka[mesto2 + 8] + stroka[mesto1 - 8]
                        
                if (0 <= mesto1 < 8 and 16 <= mesto2 < 24) or (8 <= mesto1 < 16 and 24 <= mesto2 < 32)\
                or (24 <= mesto1 < 32 and 40 <= mesto2 < 48) or (32 <= mesto1 < 40 and 48 <= mesto2 < 56)\
                or (0 <= mesto2 < 8 and 16 <= mesto1 < 24) or (8 <= mesto2 < 16 and 24 <= mesto1 < 32)\
                or (24 <= mesto2 < 32 and 40 <= mesto1 < 48) or (32 <= mesto2 < 40 and 48 <= mesto1 < 56):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 16] + stroka[mesto1 + 16]
                    else:
                        itog = itog + stroka[mesto2 + 16] + stroka[mesto1 - 16]
                        
                if (0 <= mesto1 < 8 and 24 <= mesto2 < 32) or (8 <= mesto1 < 16 and 32 <= mesto2 < 40)\
                or (16 <= mesto1 < 24 and 40 <= mesto2 < 48) or (24 <= mesto1 < 32 and 48 <= mesto2 < 56)\
                or (0 <= mesto2 < 8 and 24 <= mesto1 < 32) or (8 <= mesto2 < 16 and 32 <= mesto1 < 40)\
                or (16 <= mesto2 < 24 and 40 <= mesto1 < 48) or (24 <= mesto2 < 32 and 48 <= mesto1 < 56):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 24] + stroka[mesto1 + 24]
                    else:
                        itog = itog + stroka[mesto2 + 24] + stroka[mesto1 - 24]

                if (0 <= mesto1 < 8 and 32 <= mesto2 < 40) or (8 <= mesto1 < 16 and 40 <= mesto2 < 48)\
                or (16 <= mesto1 < 24 and 48 <= mesto2 < 56) or (0 <= mesto2 < 8 and 32 <= mesto1 < 40)\
                or (8 <= mesto2 < 16 and 40 <= mesto1 < 48)or (16 <= mesto2 < 24 and 48 <= mesto1 < 56):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 32] + stroka[mesto1 + 32]
                    else:
                        itog = itog + stroka[mesto2 + 32] + stroka[mesto1 - 32]

                if (0 <= mesto1 < 8 and 40 <= mesto2 < 48) or (8 <= mesto1 < 16 and 48 <= mesto2 < 56)\
                or (0 <= mesto2 < 8 and 40 <= mesto2 < 48) or (8 <= mesto2 < 16 and 48 <= mesto1 < 56):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 40] + stroka[mesto1 + 40]
                    else:
                        itog = itog + stroka[mesto2 + 40] + stroka[mesto1 - 40]

                if (0 <= mesto1 < 8 and 48 <= mesto2 < 56) or (0 <= mesto2 < 8 and 48 <= mesto1 < 56):
                    if mesto2 > mesto1:
                        itog = itog + stroka[mesto2 - 48] + stroka[mesto1 + 48]
                    else:
                        itog = itog + stroka[mesto2 + 48] + stroka[mesto1 - 48]

            
        itog2 = ''
        count = 0
        if mestosp != []:
            for i in range(0, len(itog)):
                
                if i == mestosp[count]:
                    
                    itog2 = itog2 + special[count] + itog[i]
                    
                    if count < len(mestosp)-1:
                        count += 1
                        
                else:
                    itog2 += itog[i]
                    
            itog = itog2
            

        itog = itog.replace("яя","")
        vuvod_Text_Playfair.insert(1.0, itog + "\n\n")


        
    root_Playfair = Tk() #создание окна
    root_Playfair.title("ШИФРОВАЛЬЩИК - КВАДРАТ ПЛЕЙФЕРА") #название окна
    root_Playfair.geometry("800x800")
    root_Playfair.minsize(width = 800, height = 800)  #устанавливаем размер окна
    root_Playfair.maxsize(width = 800, height = 800)

    pole1_Playfair = Frame(root_Playfair, width = 190, height = 130, bd = 5, bg = "cyan2") 
    pole1_Playfair.pack() #создание поля1 в окне, выбираем ширину, высоту, цвет

    lab1_Playfair = Label(pole1_Playfair, fg = "pale goldenrod", text = "Введите кодовое слово", bg = "black", width = 100, font = "Verdana 15" )
    lab1_Playfair.pack() #создание в поле1 надписи  "Введите кодовое слво", цвет поля, шрифт

    vvod_Kod_Playfair = Text(pole1_Playfair, width = 100, fg = "yellow", font = "Verdana 15", bg = "black", height = 1)
    vvod_Kod_Playfair.pack() #создание в поле1 текстого поля, куда вводят шаг

    lab2_Playfair = Label(pole1_Playfair, fg = "pale goldenrod", text = "Введите сообщение", bg = "black", width = 70, font = "Verdana 15" )
    lab2_Playfair.pack() #создание надписи "Введите сообщение", цвет поля и надписи, шрифт

    vvod_Text_Playfair = Text(pole1_Playfair, height = 9, width = 50, fg = "azure", font = "Verdana 20", bg = "black", wrap = "word")
    vvod_Text_Playfair.pack() #создание текстого поля, куда вводят слова сообщения

    pole2_Playfair = Frame(root_Playfair, width = 190, height = 100, bd = 5, bg = "cyan2")
    pole2_Playfair.pack() #создание нового поля2 в окне

    knopka_Shifr_Playfair = Button(pole2_Playfair, command = Shifr, text = "Зашифровать", fg = "yellow", font = "Verdana 15", width = 30, height = 2, bg = "grey11")
    knopka_Shifr_Playfair.grid(row = 0, column = 0) #создание в поле2 кнопки1

    knopka_Deshifr_Playfair = Button(pole2_Playfair, command = DeShifr, text = "Расшифровать", fg = "yellow", font = "Verdana 15", width = 29, height = 2, bg = "grey11")
    knopka_Deshifr_Playfair.grid(row = 0, column = 1) #создание в поле2 кнопки2

    pole3_Playfair = Frame(root_Playfair, width = 190, height = 130, bd = 5, bg = "cyan2")
    pole3_Playfair.pack() #создание поля 3 в окне

    vuvod_Text_Playfair = Text(pole3_Playfair, height = 12, width = 50, fg = "azure", font = "Verdana 20", bg = "black", wrap = "word")
    vuvod_Text_Playfair.pack() #создание текстого поля, где выводится итог

    info_Playfair = Button(pole1_Playfair, command = reference_Playfair, text = "i", fg = "yellow", font = "Verdana 15",  bg = "grey11", width = 2, height = 1)
    info_Playfair.place(x = 749, y = 5)
    info_Playfair.bind('<Enter>', set_color_info_Playfair)
    info_Playfair.bind('<Leave>', restore_color_info_Playfair)

    root_Playfair.mainloop()

def Polibiy():
    def reference_Polibiy():
        info_Polibiy = Toplevel(root_Polibiy)
        info_Polibiy.title("СПРАВКА")
        info_Polibiy.minsize(width = 556, height = 330)
        info_Polibiy.maxsize(width = 556, height = 330)
        info_Polibiy = Label(info_Polibiy, fg = "pale goldenrod", bg = "black", font = "Verdana 15", justify = LEFT, text = '                   СПРАВКА - МЕТОД ПОЛИБИЯ\nМетод Полибия – шифр замены III век до н. э.\nДля ши\
фрования создается таблица 4x8. Она\nзаполняется буквами алфавита (без Ё), и каждому\nсимволу присваиваются номер столбца и номер\nстроки. Сообщение преобразуется в координаты,\nкоторые записываются вертикально, а считыва\
ются\nгоризонтально. Далее координаты преобразуются\nв буквы по изначальной таблице. \n\nШифр Полибия имеет хорошую криптостойкость и\nпростую реализацию, но требует создания\nнескольких таблиц.')
        info_Polibiy.pack()

    def set_color_info_Polibiy(event):
        event.widget.config(bg = 'grey20')
    def restore_color_info_Polibiy(event):
        event.widget.config(bg = 'grey11')

    
        
    def Shifr():    #функция зашифровки
        message = vvod_Text_Polibiy.get(1.0, END)     #взятие слов
        message = str(message.lower())
        message = message[:-1]
        message1 = ''
        kod = vvod_Kod_Polibiy.get(1.0, END)#взятие кодового слова
        kod = kod.lower()
        stroka = 'абвгдежзийклмнопрстуфхцчшщъыьэюяbdfghijklmnqrstuvwz .,;:!?&%-+="@/\()[]0123456789'
        strok = (str(kod[:-1]) + str(stroka))
        stroka = ''
        coordinates = ["11","12","13","14","15","16","17","18","19","21","22","23","24","25","26","27","28","29","31","32","33","34","35","36","37","38","39",\
                       "41","42","43","44","45","46","47","48","49","51","52","53","54","55","56","57","58","59","61","62","63","64","65","66","67","68","69",\
                       "71","72","73","74","75","76","77","78","79","81","82","83","84","85","86","87","88","89","91","92","93","94","95","96","97","98","99"]
        co1, co2 = "", ""
        
        itog = str("")
        special, mestosp = [], []
        
        for i in range(len(strok)):
                if stroka.find(strok[i]) == -1: # удаление одинаковых символов в матрице
                    stroka += strok[i]
                
                    
        message = message.replace("\n",' ')
        message = message.replace("ё",'е')
        message = message.replace("a",'а')
        message = message.replace("c",'с')
        message = message.replace("e",'е')
        message = message.replace("o",'о')
        message = message.replace("p",'р')
        message = message.replace("x",'х')
        message = message.replace("y",'у')

        while message[len(message)-1] == " ":
            message = message[:-1]
        
        
        count = 0               
                
        for i in message:
            
            mesto = stroka.find(i)
            
            if i in stroka:
                message1 += coordinates[mesto]
                
            else:            
                special += [i]
                mestosp += [count-len(mestosp)]
                
            count += 1

            
        
        for i in range(0,len(message1),2):
            co1 += message1[i]
        for i in range(1,len(message1),2):
            co2 += message1[i]
            
        message = co1 + co2
        
        
        
        for i in range(0, len(message), 2):        
            itog += stroka[coordinates.index( str(message[i]+ message[i+1] ) ) ]
            
        itog2 = ""
        count = 0
        
        if mestosp != []:
            
            for i in range(0, len(itog)):
                
                if i == mestosp[count]:
                    
                    itog2 = itog2 + special[count] + itog[i]
                    
                    if count < len(mestosp)-1:
                        count += 1
                    
                else:
                    itog2 += itog[i]
                    
            itog = itog2
                    
        vuvod_text_Polibiy.insert(1.0, itog + "\n\n")



    def DeShifr():  #функция расшифровки
        message = vvod_Text_Polibiy.get(1.0, END)     #взятие слов
        message = str(message.lower())
        message1 = ''
        kod = vvod_Kod_Polibiy.get(1.0, END)#взятие кодового слова
        kod = kod.lower()
        stroka = 'абвгдежзийклмнопрстуфхцчшщъыьэюяbdfghijklmnqrstuvwz .,;:!?&%-+="@/\()[]0123456789'
        strok = (str(kod[:-1]) + str(stroka))
        stroka = ''
        coordinates = ["11","12","13","14","15","16","17","18","19","21","22","23","24","25","26","27","28","29","31","32","33","34","35","36","37","38","39",\
                       "41","42","43","44","45","46","47","48","49","51","52","53","54","55","56","57","58","59","61","62","63","64","65","66","67","68","69",\
                       "71","72","73","74","75","76","77","78","79","81","82","83","84","85","86","87","88","89","91","92","93","94","95","96","97","98","99"]
        co1, co2 = "", ""
        itog = str("")
        special = []
        mestosp = []
        message = message.replace("\n",' ')
        message = message.replace("ё",'е')
        message = message.replace("a",'а')
        message = message.replace("c",'с')
        message = message.replace("e",'е')
        message = message.replace("o",'о')
        message = message.replace("p",'р')
        message = message.replace("x",'х')
        message = message.replace("y",'у')
        
        message = message[:-1]
        while message[len(message)-1] == " ":
            message = message[:-1]
            
        for i in range(len(strok)):
            if stroka.find(strok[i]) == -1: # удаление одинаковых символов
                stroka += strok[i]
        
        
        count = 0
        
        for i in message:
            mesto = stroka.find(i)
            
            if i in stroka:
                message1 += coordinates[mesto]
                               
            else:
                
                special += [i]
                mestosp += [count-len(mestosp)]
                
            count += 1

        
   
        srez = len(message1)//2
        co1 = (message1[:srez])
        co2 = (message1[srez:])
        coor = ""
        for i in range(0, srez):
            coor = coor + co1[i]+ co2[i]



        
        message = message1

        for i in range(0, len(coor), 2):        
            itog += stroka[coordinates.index( str(coor[i]+ coor[i+1] ) ) ]
            
        itog2 = ''
        count = 0
        if mestosp != []:
            for i in range(0, len(itog)):
                
                if i == mestosp[count]:
                    
                    itog2 = itog2 + special[count] + itog[i]
                    
                    if count < len(mestosp)-1:
                        count += 1
                        
                else:
                    itog2 += itog[i]
                    
            itog = itog2
            
        vuvod_text_Polibiy.insert(1.0, itog + "\n\n")


        
    root_Polibiy = Tk() #создание окна
    root_Polibiy.title("ШИФРОВАЛЬЩИК - МЕТОД ПОЛИБИЯ") #название окна
    root_Polibiy.geometry("800x800")
    root_Polibiy.minsize(width = 800, height = 800)  #устанавливаем размер окна
    root_Polibiy.maxsize(width = 800, height = 800)

    pole1_Polibiy = Frame(root_Polibiy, width = 190, height = 130, bd = 5, bg = "cyan2") 
    pole1_Polibiy.pack() #создание поля1 в окне, выбираем ширину, высоту, цвет

    lab1_Polibiy = Label(pole1_Polibiy, fg = "pale goldenrod", text = "Введите кодовое слово", bg = "black", width = 100, font = "Verdana 15" )
    lab1_Polibiy.pack() #создание в поле1 надписи  "Введите кодовое слво", цвет поля, шрифт

    vvod_Kod_Polibiy = Text(pole1_Polibiy, width = 100, fg = "yellow", font = "Verdana 15", bg = "black", height = 1)
    vvod_Kod_Polibiy.pack() #создание в поле1 текстого поля, куда вводят шаг

    lab2_Polibiy = Label(pole1_Polibiy, fg = "pale goldenrod", text = "Введите сообщение", bg = "black", width = 70, font = "Verdana 15" )
    lab2_Polibiy.pack() #создание надписи "Введите сообщение", цвет поля и надписи, шрифт

    vvod_Text_Polibiy = Text(pole1_Polibiy, height = 9, width = 50, fg = "azure", font = "Verdana 20", bg = "black", wrap = "word")
    vvod_Text_Polibiy.pack() #создание текстого поля, куда вводят слова сообщения

    pole2_Polibiy = Frame(root_Polibiy, width = 190, height = 100, bd = 5, bg = "cyan2")
    pole2_Polibiy.pack() #создание нового поля2 в окне

    knopka_Shifr_Polibiy = Button(pole2_Polibiy, command = Shifr, text = "Зашифровать", fg = "yellow", font = "Verdana 15", width = 30, height = 2, bg = "grey11")
    knopka_Shifr_Polibiy.grid(row = 0, column = 0) #создание в поле2 кнопки1

    knopka_Deshifr_Polibiy = Button(pole2_Polibiy, command = DeShifr, text = "Расшифровать",fg = "yellow", font = "Verdana 15", width = 29, height = 2, bg = "grey11")
    knopka_Deshifr_Polibiy.grid(row = 0, column = 1) #создание в поле2 кнопки2

    pole3_Polibiy = Frame(root_Polibiy, width = 190, height = 130, bd = 5, bg = "cyan2")
    pole3_Polibiy.pack() #создание поля 3 в окне

    vuvod_text_Polibiy = Text(pole3_Polibiy, height = 12, width = 50, fg = "azure", font = "Verdana 20", bg = "black", wrap = "word")
    vuvod_text_Polibiy.pack() #создание текстого поля, где выводится итог

    info_Polibiy = Button(pole1_Polibiy, command = reference_Polibiy, text = "i", fg = "yellow", font = "Verdana 15",  bg = "grey11", width = 2, height = 1)
    info_Polibiy.place(x = 749, y = 5)
    info_Polibiy.bind('<Enter>', set_color_info_Polibiy)
    info_Polibiy.bind('<Leave>', restore_color_info_Polibiy)

    root_Polibiy.mainloop()  


def set_color_Ceasar(event):
    event.widget.config(bg = 'blue2')
def restore_color_Ceasar(event):
    event.widget.config(bg = 'grey11')

def set_color_Atbash(event):
    event.widget.config(bg = 'gold',fg = "black")
def restore_color_Atbash(event):
    event.widget.config(bg = 'grey11',fg = "yellow")

def set_color_Vigenere(event):
    event.widget.config(bg = 'red3')
def restore_color_Vigenere(event):
    event.widget.config(bg = 'grey11')

def set_color_Playfair(event):
    event.widget.config(bg = 'purple')
def restore_color_Playfair(event):
    event.widget.config(bg = 'grey11')

def set_color_Polibiy(event):
    event.widget.config(bg = 'grey')
def restore_color_Polibiy(event):
    event.widget.config(bg = 'grey11')

def set_color_Info(event):
    event.widget.config(bg = 'grey20')
def restore_color_Info(event):
    event.widget.config(bg = 'grey11')


#------------------------------------------------------------------------------------------------------#
    
root = Tk() #создание окна
root.title("ШИФРОВАЛЬЩИК") #название окна
root.geometry("800x700")
root.minsize(width = 800, height = 700)  #устанавливаем размер окна
root.maxsize(width = 800, height = 700)
root["bg"] = "cyan2"

pole = Frame(root, width = 780, height = 680, bd = 5, bg = "black") 
pole.place(x = 10, y = 10) #создание поля1 в окне, выбираем ширину, высоту, цвет

knopka_Caesar = Button(pole, text = "Сдвиг Цезаря", command = Caesar, fg = "yellow", font = "Verdana 15", width = 17, height = 2, bg = "grey11")
knopka_Caesar.place(x = 10, y = 30) #создание в поле2 кнопки1
knopka_Caesar.bind('<Enter>', set_color_Ceasar)
knopka_Caesar.bind('<Leave>', restore_color_Ceasar)

knopka_Atbash = Button(pole, text = "Шифр Атбаш", command = Atbash, fg = "yellow", font = "Verdana 15", width = 17, height = 2, bg = "grey11")
knopka_Atbash.place(x = 10, y = 160) #создание в поле2 кнопки2
knopka_Atbash.bind('<Enter>', set_color_Atbash)
knopka_Atbash.bind('<Leave>', restore_color_Atbash)

knopka_Vigenere = Button(pole, text = "Шифр Виженера", command = Vigenere, fg = "yellow", font = "Verdana 15", width = 17, height = 2, bg = "grey11")
knopka_Vigenere.place(x = 10, y = 290) #создание в поле2 кнопки1
knopka_Vigenere.bind('<Enter>', set_color_Vigenere)
knopka_Vigenere.bind('<Leave>', restore_color_Vigenere)

knopka_Playfair = Button(pole, text = "Квадрат Плейфера", command = Playfair, fg = "yellow", font = "Verdana 15", width = 17, height = 2, bg = "grey11")
knopka_Playfair.place(x = 10, y = 420) #создание в поле2 кнопки2
knopka_Playfair.bind('<Enter>', set_color_Playfair)
knopka_Playfair.bind('<Leave>', restore_color_Playfair)

knopka_Polibiy = Button(pole, text = "Метод Полибия", command = Polibiy,fg = "yellow", font = "Verdana 15", width = 17, height = 2, bg = "grey11")
knopka_Polibiy.place(x = 10, y = 550) #создание в поле2 кнопки1
knopka_Polibiy.bind('<Enter>', set_color_Polibiy)
knopka_Polibiy.bind('<Leave>', restore_color_Polibiy)




lab_Caesar = Label(pole, fg = "pale goldenrod", justify = LEFT, text = "Шифр простой замены. При шифровании \nкаждый символ заменяется\
 другим, стоящим\nот него в алфавите на k позиций. Прост \nв реализации, но не устойчив к взлому.", bg = "black", font = "Verdana 15")
lab_Caesar.place(x = 260, y = 10)

knopka_Info = Button(pole, text = "Help", fg = "yellow", font = "Verdana 15", bg = "grey11", width = 4, height = 1, command = Info)
knopka_Info.place(x = 712, y = -2)
knopka_Info.bind('<Enter>', set_color_Info)
knopka_Info.bind('<Leave>', restore_color_Info)

lab_Atbash = Label(pole, fg = "pale goldenrod", justify = LEFT, text = "Шифр простой замены, использованный \nвпервые для еврейск\
ого алфавита. \nЗамена первой буквы алфавита на последню,\nвторой на предпоследнюю и т.д. Не надежен.", bg = "black", font = "Verdana 15")
lab_Atbash.place(x = 260, y = 140)

lab_Vigenere = Label(pole, fg = "pale goldenrod", justify = LEFT, text = "Метод многоалфавитной замены с кодовым \nсловом. При шифровании каждая буква \nзаменяется на сим\
вол, стоящий на k позиций\nправее, где k – место буквы в кодовом слове.", bg = "black", font = "Verdana 15")
lab_Vigenere.place(x = 260, y = 270) 

lab_Playfair = Label(pole, fg = "pale goldenrod", justify = LEFT, text = "Криптоустойчивый шифр с использованием \nматрицы и кодового слова. Алгоритм          \nзашифровывает па\
ры символов сообщения\nв зависимости от их положения в матрице.", bg = "black",  font = "Verdana 15")
lab_Playfair.place(x = 260, y = 400) 

lab_Polibiy = Label(pole, fg = "pale goldenrod", justify = LEFT, text = "Нестандартный шифр с применением матрицы.\nСообщение преобразуется в координаты, \nкоторые записыв\
аются вертикально, а \nсчитываются горизонтально. Криптоустойчив.", bg = "black", font = "Verdana 15")
lab_Polibiy.place(x = 259, y = 530)

root.clipboard_append("")
def paste_buffer(event):
        vvod_Text_Ceasar['text'] = root.clipboard_get()

def copy_buffer(event):
    root.clipboard_append[vuvod_Text_Ceasar.get(1.0, END)]
    
root.bind("<Control-v>", paste_buffer)
root.bind("<Control-c>", copy_buffer)


root.mainloop()

