#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()