#coding: utf-8 from Tkinter import * from tkMessageBox import * from tkFileDialog import * from ttk import * import RSA_functions import os import py2exe class MainWindow(Tk): def __init__(self): Tk.__init__(self) Frame = self Frame.title('RSA program') Frame.geometry("600x460+700+300") Frame.minsize(600, 460) self.message_file_name = StringVar() self.secret_key_file_name = StringVar() self.open_key = StringVar() self.result_file_name = StringVar() self.N_file_name = StringVar() self.action_type = IntVar(value=0) self.place_elements() def place_elements(self): # Enter message key self.top_frame = Frame(self) self.top_frame.place(x=10, y=10) self.label_top = Label(self.top_frame, text='Загрузить файл') self.label_top.pack(side='top') self.entry_message_file_name = Entry(self.top_frame, width=50) self.entry_message_file_name['textvariable'] = self.message_file_name self.entry_message_file_name.pack(side='left') self.button_message_file_name = Button(self.top_frame, text='Открыть') self.button_message_file_name['command'] = lambda: self.message_file_name.set(askopenfilename()) self.button_message_file_name.pack(padx=5) # Choose action type self.middle_frame = Frame(self) self.middle_frame.place(x=10, y=80) self.radiobutton_encrypt = Radiobutton(self.middle_frame, variable=self.action_type, value=0, text='Шифрование') self.radiobutton_encrypt.pack(side='left') self.radiobutton_encrypt['command'] = lambda: (self.decrypt_frame.pack_forget(), self.encrypt_frame.pack()) self.radiobutton_decrypt = Radiobutton(self.middle_frame, variable=self.action_type, value=1, text='Дешифрование') self.radiobutton_decrypt.pack() self.radiobutton_decrypt['command'] = lambda: (self.encrypt_frame.pack_forget(), self.decrypt_frame.pack()) # Main frame self.main_frame = Frame(self) self.main_frame.place(x=10, y=140) self.encrypt_frame_create() self.decrypt_frame_create() self.encrypt_frame.pack() # Enter result file name self.bottom_frame = Frame(self) self.bottom_frame.place(x=10, y=350) self.label_middle = Label(self.bottom_frame, text='Выбрать/Создать файл для сохранения результата') self.label_middle.pack(side='top') self.entry_result_file_name = Entry(self.bottom_frame, width=50) self.entry_result_file_name['textvariable'] = self.result_file_name self.entry_result_file_name.pack(side='left') self.button_result_file_name = Button(self.bottom_frame, text='Открыть') self.button_result_file_name['command'] = lambda: self.result_file_name.set(asksaveasfilename()) self.button_result_file_name.pack(side='left', padx=5) # Start button self.start_frame = Frame(self) self.start_frame.place(x=10, y=410) self.button_start = Button(self.start_frame, text='Начать') self.button_start['command'] = self.crypt_operation self.button_start.pack(side='bottom') def encrypt_frame_create(self): self.encrypt_frame = Frame(self.main_frame) self.label_middle = Label(self.encrypt_frame, text='Ввод открытого ключа (минимальное количество знаков -15)') self.label_middle.pack(side='top', expand='True') self.entry_open_key = Entry(self.encrypt_frame, width=50) self.entry_open_key['textvariable'] = self.open_key self.entry_open_key.pack(side='top', anchor=W) self.sub_frame = Frame(self.encrypt_frame) self.sub_frame.pack(side='bottom', pady=3) self.N_frame = Frame(self.encrypt_frame) self.N_frame.pack(side='bottom', pady=3) #save secret key self.label_middle = Label(self.sub_frame, text='Создать файл для сохранения секретного ключа') self.label_middle.pack(side='top') self.entry_save_secret_key_file = Entry(self.sub_frame, width=50) self.entry_save_secret_key_file['textvariable'] = self.secret_key_file_name self.entry_save_secret_key_file.pack(side='left') self.button_save_secret_key_file = Button(self.sub_frame, text='Открыть') self.button_save_secret_key_file['command'] = lambda: self.secret_key_file_name.set(asksaveasfilename()) self.button_save_secret_key_file.pack(padx=5) #save N self.label_N = Label(self.N_frame, text='Создать файл для сохранения модуля N') self.label_N.pack(side='top', expand='True') self.entry_save_N_in_file = Entry(self.N_frame, width=50) self.entry_save_N_in_file['textvariable'] = self.N_file_name self.entry_save_N_in_file.pack(side='left') self.button_save_N_in_file = Button(self.N_frame, text='Открыть') self.button_save_N_in_file['command'] = lambda: self.N_file_name.set(asksaveasfilename()) self.button_save_N_in_file.pack(padx=5) def decrypt_frame_create(self): self.decrypt_frame = Frame(self.main_frame) self.N_frame = Frame(self.decrypt_frame) self.N_frame.pack(padx=5) #secret key self.label_middle = Label(self.decrypt_frame, text='Загрузить файл с секретным ключом') self.label_middle.pack(side='top') self.entry_load_secret_key_file = Entry(self.decrypt_frame, width=50) self.entry_load_secret_key_file['textvariable'] = self.secret_key_file_name self.entry_load_secret_key_file.pack(side='left') self.button_load_secret_key_file = Button(self.decrypt_frame, text='Открыть') self.button_load_secret_key_file['command'] = lambda: self.secret_key_file_name.set(askopenfilename()) self.button_load_secret_key_file.pack(padx=5, pady=3) #N self.label_N = Label(self.N_frame, text='Загрузить файл с модулем N') self.label_N.pack(side='top') self.entry_load_N = Entry(self.N_frame, width=50) self.entry_load_N['textvariable'] = self.N_file_name self.entry_load_N.pack(side='left') self.button_load_N = Button(self.N_frame, text='Открыть') self.button_load_N['command'] = lambda: self.N_file_name.set(askopenfilename()) self.button_load_N.pack(padx=5, pady=3) def crypt_operation(self): if self.action_type.get() == 0: self.encrypt_file() elif self.action_type.get() == 1: self.decrypt_file() def encrypt_file(self): try: if (os.path.exists(self.message_file_name.get())): if (self.result_file_name.get() != ''): if (self.N_file_name.get() != ''): try: open_key = int(self.open_key.get()) if (open_key < RSA_functions.F) & (RSA_functions.gcd(RSA_functions.F, open_key) == 1) \ & (len(str(open_key)) >= 15): secret_key = RSA_functions.save_secret_key(open_key, self.secret_key_file_name.get(), RSA_functions.F) mod_N = RSA_functions.save_N(self.N_file_name.get()) if secret_key: if mod_N: RSA_functions.encrypt(self.message_file_name.get(), self.result_file_name.get(), self.open_key.get(), RSA_functions.N) showinfo("Шифрование", "Успешно!") else: showinfo("Формирование ключа", "Ошибка формирования модуля N") else: showinfo("Формирование ключа", "Ошибка секретного ключа") else: showinfo("Шифрование", "Выберите другой открытый ключ") except Exception: showinfo("Формирование ключа", "Неправильный открытый ключ") else: showinfo("Формирование ключа", "Ошибка имени файла для хранения модуля N") else: showinfo("Шифрование", "Ошибка имени файла для хранения результата") else: showinfo("Шифрование", "Неправильное имя исходного файла") except Exception: showinfo("Шифрование", "Что-то пошло не так...") def decrypt_file(self): try: if (os.path.exists(self.message_file_name.get())): if (self.result_file_name.get() != ''): try: file_s = open(self.secret_key_file_name.get(), 'rb') secret_key = int(file_s.read()) try: file_s = open(self.N_file_name.get(), 'rb') N = int(file_s.read()) if secret_key: RSA_functions.decrypt(self.message_file_name.get(), self.result_file_name.get(), secret_key, N) showinfo("Дешифрование", "Успешно!") except Exception: showinfo("Загрузка ключа", "Неправильный модуль N") except Exception: showinfo("Загрузка ключа", "Неправильный секретный ключ") else: showinfo("Дешифрование", "Ошибка имени файла для хранения результата") else: showinfo("Дешифрование", "Неправильное имя исходного файла") except Exception: showinfo("Дешифрование", "Что-то пошло не так...") MainWindow().mainloop()