#coding: utf-8
from Tkinter import *
from tkMessageBox import *
from tkFileDialog import *
import paszi
import os
class MainWindow(Tk):
def __init__(self):
Tk.__init__(self)
Frame = self
Frame.title('RSA program')
Frame.geometry("300x300+450+100")
Frame.minsize(300, 300)
self.message_file_name = StringVar()
self.secret_key_file_name = StringVar()
self.open_key = StringVar()
self.result_file_name = StringVar()
self.action_type = IntVar(value=0)
self.crypt_operation = self.encrypt_file
self.place_elements()
def place_elements(self):
# Enter message key
self.top_frame = Frame(self)
self.top_frame.pack(padx=3)
self.entry_message_file_name = Entry(self.top_frame)
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=u'Открыть')
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.pack()
self.radiobutton_encrypt = Radiobutton(self.middle_frame, variable=self.action_type, value=0, text=u'Зашифровать')
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=u'Расшифровать')
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.pack()
self.encrypt_frame_create()
self.decrypt_frame_create()
self.encrypt_frame.pack()
# Enter result file name
self.bottom_frame = Frame(self)
self.bottom_frame.pack(pady=3)
self.entry_result_file_name = Entry(self.bottom_frame)
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=u'Открыть')
self.button_result_file_name['command'] = lambda: self.result_file_name.set(asksaveasfilename())
self.button_result_file_name.pack(padx=5)
# Start button
self.start_frame = Frame(self)
self.start_frame.pack(pady=3)
self.button_start = Button(self.start_frame, text=u'Начать')
self.button_start['command'] = self.crypt_operation
self.button_start.pack()
def encrypt_frame_create(self):
self.encrypt_frame = Frame(self.main_frame)
self.entry_open_key = Entry(self.encrypt_frame)
self.entry_open_key['textvariable'] = self.open_key
self.entry_open_key.pack(anchor=W)
self.sub_frame = Frame(self.encrypt_frame)
self.sub_frame.pack(pady=3)
self.entry_save_secret_key_file = Entry(self.sub_frame)
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=u'Открыть')
self.button_save_secret_key_file['command'] = lambda: self.secret_key_file_name.set(asksaveasfilename())
self.button_save_secret_key_file.pack(padx=5)
def decrypt_frame_create(self):
self.decrypt_frame = Frame(self.main_frame)
self.entry_load_secret_key_file = Entry(self.decrypt_frame)
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=u'Открыть')
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)
def encrypt_file(self):
try:
open_key = int(self.open_key.get())
self.save_secret_key()
if (open_key < paszi.F) & (paszi.gcd(paszi.F, open_key) == 1):
if os.path.exists(self.message_file_name.get()):
paszi.encrypt(self.message_file_name.get(), self.open_key.get(), paszi.N)
showinfo("Encrypting", "Successful!")
else:
showinfo("Encrypting", "Wrong file name")
else:
showinfo("Encrypting", "Wrong open key")
except ValueError:
showinfo("Encrypting", "Something wrong")
def decrypt_file(self):
try:
file_s = open(self.secret_key_file_name.get(), 'r')
secret_key = int(file_s.read())
if os.path.exists(self.secret_key_file_name.get()) & os.path.exists(self.message_file_name.get()):
#print self.a[0], self.b[0], secret_key, self.N
paszi.decrypt(self.message_file_name.get(), self.secret_key_file_name.get(), secret_key, paszi.N)
showinfo("Decrypting", "Successful!")
else:
showinfo("Decrypting", "Wrong file name")
file_s.close()
except ValueError:
showinfo("Decrypting", "Something wrong")
def save_secret_key(self):
try:
d = int(paszi.multiple_inv(int(self.open_key.get()), paszi.N))
print d
f = open(self.secret_key_file_name.get(), "w")
f.write(str(d))
f.close()
showinfo("It's OK", "The private key is successfully loaded")
except Exception:
showinfo("ERROR", "Lapsus :(")
def crypt_operation(self):
if self.action_type == 0:
self.decrypt_file()
elif self.action_type == 1:
self.encrypt_file()
MainWindow().mainloop()