Advertisement
k_vychodilova

krypto_playfair

Nov 6th, 2017
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.21 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from Tkinter import *
  3. import tkMessageBox
  4. from string import ascii_uppercase
  5.  
  6. okno = Tk()
  7. okno.title(u"Playfair šifra_Kryptologie")
  8. okno.resizable(False, False)
  9.  
  10. tabulka_vypis = StringVar()
  11.  
  12. vysledek_vypis = StringVar()
  13.  
  14. nadpis = Label(okno, text=u"Playfair šifra", font="Arial, 20")
  15. nadpis.grid()
  16.  
  17. ramec = Frame(okno)
  18. ramec.grid()
  19. nadpis_check = Label(ramec, text=u"Zvol použitu abecedu: ")
  20. nadpis_check.grid(row=1)
  21.  
  22. var_aj = IntVar()
  23. aj_check = Checkbutton(ramec, text="AJ", variable=var_aj)
  24. aj_check.grid(row=2, column=0)
  25.  
  26. var_cz = IntVar()
  27. cz_check = Checkbutton(ramec, text="CZ", variable=var_cz)
  28. cz_check.grid(row=2, column=1)
  29.  
  30. nadpis_vstupnitext = Label(ramec, text=u"Zadej vstupní text: ")
  31. nadpis_vstupnitext.grid(row=4, column=0, sticky=W)
  32.  
  33. vstupni_text = Entry(ramec, bd=5)
  34. vstupni_text.grid(row=4, column=1)
  35.  
  36. nadpis_klic = Label(ramec, text=u"Zadej klíč: ")
  37. nadpis_klic.grid(row=5, column=0, sticky=W)
  38. klic = Entry(ramec, bd=5)
  39. klic.grid(row=5, column=1)
  40.  
  41. class Tabulka:
  42.     def __init__(self, klic, typ):
  43.         self.velikost = 5
  44.         self.matice = list()
  45.  
  46.         unikatni_klic = []
  47.         [unikatni_klic.append(x.upper()) for x in klic if x.upper() not in unikatni_klic]
  48.         abeceda = list(ascii_uppercase)
  49.         for znak in unikatni_klic:
  50.             abeceda.remove(znak)
  51.  
  52.         if typ == "en":
  53.             abeceda.remove("J")
  54.         elif typ == "cz":
  55.             abeceda.remove("W")
  56.  
  57.         pismena = unikatni_klic
  58.         pismena.extend(abeceda)
  59.  
  60.         for y in range(0, self.velikost):
  61.             self.matice.append(list())
  62.             for x in range(0, self.velikost):
  63.                 self.matice[y].append(pismena[y * self.velikost + x])
  64.  
  65.  
  66.  
  67.     def pismeno(self, p):
  68.         for y in range(0, self.velikost):
  69.             for x in range(0, self.velikost):
  70.                 if self.matice[y][x] == p:
  71.                     return x, y
  72.  
  73.     def pismeno_na_souradnce(self, x, y):
  74.         return self.matice[y][x]
  75.  
  76. a = Tabulka("kolotoc", "cz")
  77.  
  78. def sifrovani():
  79.     delka = len(vstupni_text.get())
  80.     delka_klice = len(klic.get())
  81.     anglicka_verze = var_aj.get() == 1
  82.     ceska_verze = var_cz.get() == 1
  83.     typ = ""
  84.  
  85.     if delka != 0 and delka_klice != 0:
  86.         vstup = vstupni_text.get().upper().replace(" ","MEZE")
  87.         if  anglicka_verze and (not ceska_verze):
  88.             """nahrazení j za i"""
  89.             typ = "en"
  90.             vstup=vstup.replace("J","I")
  91.  
  92.         elif ceska_verze and (not anglicka_verze):
  93.             typ = "cz"
  94.             vstup=vstup.replace("W","V")
  95.         else:
  96.             tkMessageBox.showinfo("Chyba", "Byly  zadany spatne vstupni parametry!")
  97.             return
  98.         """sifrovani"""
  99.         tabulka_pismen = Tabulka(klic.get(), typ)
  100.         vysledek = []
  101.         for znak in ascii_uppercase:
  102.             vstup = vstup.replace(znak + znak, znak + "X" + znak)
  103.         if len(vstup) % 2 == 1:
  104.             if vstup[-1] == "X":
  105.                 vstup = vstup + "QXQ"
  106.             else:
  107.                 vstup = vstup + "X"
  108.  
  109.         for i, znak in enumerate(vstup):
  110.             if i % 2 == 0:
  111.                 x1, y1 = tabulka_pismen.pismeno(znak)
  112.                 x2, y2 = tabulka_pismen.pismeno(vstup[i + 1])
  113.  
  114.                 if y1 == y2:
  115.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce((x1 + 1) % tabulka_pismen.velikost, y2))
  116.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce((x2 + 1) % tabulka_pismen.velikost, y1))
  117.  
  118.                 if x1 == x2:
  119.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce(x1, (y1 + 1) % tabulka_pismen.velikost))
  120.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce(x2, (y2 + 1) % tabulka_pismen.velikost))
  121.                 else:
  122.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce(x2, y1))
  123.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce(x1, y2))
  124.  
  125.         textovy_vysledek = []
  126.         for i, znak in enumerate(vysledek):
  127.             if i % 5 == 0 and i != 0:
  128.                 textovy_vysledek.append(" ")
  129.             textovy_vysledek.append(znak)
  130.  
  131.         if len(vysledek) % 5 != 0:
  132.             textovy_vysledek.extend(list(("X" * (5- (len(vysledek) % 5)))))
  133.         print "".join(textovy_vysledek)
  134.         vypis="".join(textovy_vysledek)
  135.         return vysledek_vypis.set(vypis)
  136.  
  137.  
  138.     else:
  139.             tkMessageBox.showinfo("Chyba", "Byly  zadany spatne vstupni parametry!")
  140.  
  141. def desifrovani():
  142.     delka = len(vstupni_text.get())
  143.     delka_klice = len(klic.get())
  144.     anglicka_verze = var_aj.get() == 1
  145.     ceska_verze = var_cz.get() == 1
  146.     typ = ""
  147.  
  148.     if delka != 0 and delka_klice != 0:
  149.         vstup = vstupni_text.get().upper()
  150.         if  anglicka_verze and (not ceska_verze):
  151.             """nahrazení j za i"""
  152.             typ = "en"
  153.  
  154.         elif ceska_verze and (not anglicka_verze):
  155.             typ = "cz"
  156.         else:
  157.             tkMessageBox.showinfo("Chyba", "Byly  zadany spatne vstupni parametry!")
  158.             return
  159.         """desifrovani"""
  160.         tabulka_pismen = Tabulka(klic.get(), typ)
  161.         vysledek = []
  162.  
  163.         for i, znak in enumerate(vstup):
  164.             if i % 2 == 0:
  165.                 x1, y1 = tabulka_pismen.pismeno(znak)
  166.                 x2, y2 = tabulka_pismen.pismeno(vstup[i + 1])
  167.  
  168.                 if y1 == y2:
  169.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce((x1 - 1) % tabulka_pismen.velikost, y2))
  170.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce((x2 - 1) % tabulka_pismen.velikost, y1))
  171.  
  172.                 if x1 == x2:
  173.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce(x1, (y1 - 1) % tabulka_pismen.velikost))
  174.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce(x2, (y2 - 1) % tabulka_pismen.velikost))
  175.                 else:
  176.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce(x2, y1))
  177.                     vysledek.append(tabulka_pismen.pismeno_na_souradnce(x1, y2))
  178.         print "".join(vysledek).replace("MEZE", " ")
  179.         vypis="".join(vysledek).replace("MEZE", " ")
  180.         return vysledek_vypis.set(vypis)
  181.  
  182.         reseni=""
  183.         for radek in tabulka_pismen.matice:
  184.             reseni=reseni +"".join(radek) + "\n"
  185.             print res
  186.         return  tabulka_vypis.set(reseni)
  187.     else:
  188.             tkMessageBox.showinfo("Chyba", "Byly  zadany spatne vstupni parametry!")
  189.  
  190. ramec_tlacitka = Frame(okno)
  191. ramec_tlacitka.grid()
  192. tlac_zasifrovat = Button(ramec_tlacitka, text="Zasifrovat", command=sifrovani)
  193. tlac_zasifrovat.grid(row=6, column=0)
  194. tlac_desifrovat = Button(ramec_tlacitka, text="Desifrovat", command=desifrovani)
  195. tlac_desifrovat.grid(row=6, column=1)
  196.  
  197. label_vypistabulky = LabelFrame(okno, text=u"Šifrovací/dešifrovací tabulka", bd=5)
  198. label_vypistabulky.grid(row=8, sticky=W + E)
  199.  
  200. text = Label(label_vypistabulky, textvariable=tabulka_vypis)
  201. text.grid(padx=5, pady=10)
  202.  
  203. label_vypisvysledku = LabelFrame(okno, text=u"Vysledek šifrování/dešifrování: ", bd=5)
  204. label_vypisvysledku.grid(row=7, sticky=W + E)
  205.  
  206. text_vysledek = Label(label_vypisvysledku, textvariable=vysledek_vypis)
  207. text_vysledek.grid(padx=5, pady=10)
  208.  
  209. okno.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement