Jak szybko opracować użyteczne narzędzia do kryptografii symetrycznej w Tcl/Tk

W kolejnym artykule chciałbym skupić się na błyskawicznym wytwarzaniu skryptowego oprogramowania implementującego symetryczne szyfrowanie i deszyfrowanie tekstu. Załączone kody źródłowe pokazują, jak szyfrować i deszyfrować tekst silnymi algorytmami kryptograficznymi AES i Blowfish z wykorzystaniem bardzo przyjaznego języka skryptowego TCL (Tool Command Language) oraz bibliotek widgetów graficznych Tk.

Oczywiście, narzędzia tu zaprezentowane można wykorzystywać w różnych mniej lub bardziej poważnych praktycznych zastosowaniach, choć moją intencją było napisanie ich do celów szkoleniowych, by pokazać uczestnikom warsztatów, jak na bazie wiedzy podstawowej budować narzędzia o znacznie poważniejszym zakresie zastosowań. Jestem bowiem przekonany, że należy najpierw dobrze opanować wytwarzanie cegieł, by z nich w następnej kolejności budować solidne budowle. Kryptografia symetryczna jest tutaj taką właśnie cegłówką, a budowlą może być cokolwiek, co bazuje na silnym zabezpieczeniu poufności różnych treści – haseł, wiadomości, plików, danych transmitowanych przez sieć itp.

W sumie załączam cztery kody źródłowe. Pierwsze dwa to narzędzia operujące na pojedynczych wierszach tekstu (crypto one-liners). Jedno z nich szyfruje i deszyfruje algorytmem AES, drugie natomiast czyni to samo Blowfishem.aes_one-linerJak widać na załączonych obrazkach, oba narzędzia zostały wyposażone w graficzny interfejs użytkownika oparty o widgety biblioteki Tk. Funkcje szyfrowanie i deszyfrowania zostały w nich zaimplementowane na poziomie graficznego interfejsu użytkownika w postaci zakładek Encryption/Decryption, pomiędzy którymi możemy bardzo łatwo przełączać się przy pomocy myszki lub kombinacji klawiszy <CONTROL>+<TAB>.

blowfish_one-linerKolejne dwa narzędzia oferują możliwość szyfrowania i odszyfrowywania tekstów wielowierszowych (crypto multiliners). Pierwszy kod oczywiście implementuje szyfrowanie i deszyfrowanie algorytmem AES, drugi natomiast stosuje algorytm Blowfish.

aes_multilinerJak w przypadku pierwszych dwóch narzędzi, tutaj także mamy na poziomie graficznego interfejsu użytkownika do dyspozycji wygodne przełączanie się pomiędzy zakładkami Encryption i Decryption.

blowfish_multilinerPrzypomnę, że uruchomienie skryptów wymaga interpretera języka Tcl. W MacOS i na wielu systemach Unixowych będziemy go mieli w standardowej dystrybucji systemu. Jeśli natomiast zechcemy tworzyć narzędzia w środowisku Windows, to wcześniej musimy zaopatrzyć się w interpreter i biblioteki języka. Z pełnym przekonaniem polecam dystrybucję ActiveState dostępną na ich stronach internetowych, w wersji Community Edition kompletnie za darmo (także dla MacOS i na Linux-y). Należy zainstalować, a potem pobrać z internetu najnowsze wersje bibliotek poleceniem:

teacup update

Ponieważ skrypty posiadają graficzny interfejs użytkownika oparty o widgety biblioteki Tk, uruchamiamy je przy pomocy interpretera wish z obsługą grafiki (nie tclsh, który służy do uruchamiania skryptów pracujących w trybie znakowym):

wish nazwa_skryptu.tcl

Jeśli zechcecie przekazać swoje narzędzia skryptowe komuś, kto nie posiada interpretera Tcl/Tk, to możecie skrypty „kompilować” do postaci programów wykonywalnych. Nie jest to co prawda stricte kompilacja lecz pakowanie do pliku EXE, ale efekt dla użytkownika jest podobny – jest nim samodzielny program wykonywalny. W tym celu, by móc to uczynić, potrzebujemy narzędzia freewrap, które można pobrać z serwisu Sourceforge za darmo. Potem jedynie trzeba wykonać następujące polecenie:

freewrap nazwa_skryptu.tcl

W jego efekcie w katalogu aktualnym pojawi się autonomiczny program pod postacią pliku o nazwie nazwa_skryptu.exe, w formie umożliwiającej obdarowanie nim znajomego, który może program uruchomić – jak wcześniej wspomniałem – całkowicie autonomicznie, nie mając zainstalowanego u siebie interpretera Tcl/Tk.

Zachęcam do dalszego eksperymentowania z kodem skryptów.

Oto kod skryptu AES one-liner:

package require aes
package require base64

proc encrypt {key plaintext} {
   if {[ string length $key] < 16} {
      set key [format "%-16s" $key]
   } else {
      set key [string range $key 0 15]
   }
   # tk_messageBox -message "Key :$key:" -title {Info}
   set ciphertext [aes::aes -dir encrypt -key $key "$plaintext"]
   set ciphertext [::base64::encode $ciphertext]
   return $ciphertext
}

proc decrypt {key ciphertext} {
   if {[ string length $key] < 16} {
      set key [format "%-16s" $key]
   } else {
      set key [string range $key 0 15]
   }
   set ciphertext [::base64::decode $ciphertext]
   set plaintext [aes::aes -dir decrypt -key $key "$ciphertext"]
   return $plaintext
}

proc asterix  {entry_widget checkvalue} {
   global selected
   if {$checkvalue == 0} {
      $entry_widget configure -show *
      set selected 0
   } else {
      $entry_widget configure -show ""
      set selected 1
   }
}

set plaintext ""; set ciphertext ""; set key "S3cYouRe";

ttk::notebook .nb

# -------------- Encryption ------------------

frame .nb.enc_fr
labelframe .nb.enc_fr.plain_frame -text "Plaintext"
label .nb.enc_fr.plain_frame.lab -text "Enter plaintext"
entry .nb.enc_fr.plain_frame.plain_entry -textvariable plaintext -width 35

frame .nb.enc_fr.param
label .nb.enc_fr.param.key_lab -text "Crypto key"
entry .nb.enc_fr.param.key_entry -textvariable key
checkbutton .nb.enc_fr.param.cb -text "Show password" -command {asterix .nb.enc_fr.param.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected
         
button .nb.enc_fr.param.exec_button -text "Encrypt it..." -command { set ciphertext [encrypt $key $plaintext] }

labelframe .nb.enc_fr.cipher_frame -text "Ciphertext"
entry .nb.enc_fr.cipher_frame.cipher_entry -textvariable ciphertext

set normal_font [.nb.enc_fr.cipher_frame.cipher_entry cget -font]
font create bolden_font -family $normal_font -weight bold -size 10

.nb.enc_fr.cipher_frame.cipher_entry configure -bg red -fg yellow -font bolden_font

button .nb.enc_fr.exit_button -text "Exit" -command {exit}

pack .nb.enc_fr.plain_frame -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.enc_fr.plain_frame.lab -side left -padx 3
pack .nb.enc_fr.plain_frame.plain_entry -side left -padx 2 -fill x -expand 1

pack .nb.enc_fr.param -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.enc_fr.param.key_lab -side left -padx 2
pack .nb.enc_fr.param.key_entry -side left -padx 2 -fill x -expand 1
pack .nb.enc_fr.param.cb -side left 
pack .nb.enc_fr.param.exec_button -side left -padx 3

pack .nb.enc_fr.cipher_frame -fill both -expand 1 -ipadx 10 -ipady 10
pack .nb.enc_fr.cipher_frame.cipher_entry -fill x -expand 1 -pady 1 -padx 3

pack .nb.enc_fr.exit_button -fill none -pady 5 -padx 3 -ipadx 30

# -------------- Decryption ------------------

frame .nb.decr_fr
labelframe .nb.decr_fr.cipher_frame -text "Ciphertext"
label .nb.decr_fr.cipher_frame.lab -text "Enter ciphertext"
entry .nb.decr_fr.cipher_frame.cipher_entry -textvariable ciphertext

frame .nb.decr_fr.param
label .nb.decr_fr.param.key_lab -text "Crypto key"
entry .nb.decr_fr.param.key_entry -textvariable key
checkbutton .nb.decr_fr.param.cb -text "Show password" -command {asterix .nb.decr_fr.param.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected

label .nb.decr_fr.cipher_frame.key_lab -text "Crypto key"
entry .nb.decr_fr.cipher_frame.key_entry -textvariable key
checkbutton .nb.decr_fr.cipher_frame.cb -text "Show password" -command {asterix .nb.decr_fr.cipher_frame.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected
         
button .nb.decr_fr.param.exec_button -text "Decrypt it..." -command { set plaintext [decrypt $key $ciphertext] }

labelframe .nb.decr_fr.plain_frame -text "Plaintext"
entry .nb.decr_fr.plain_frame.plain_entry -textvariable plaintext

.nb.decr_fr.plain_frame.plain_entry configure -bg red -fg yellow -font bolden_font

button .nb.decr_fr.exit_button -text "Exit" -command {exit}

pack .nb.decr_fr.cipher_frame -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.decr_fr.cipher_frame.lab -side left -padx 3
pack .nb.decr_fr.cipher_frame.cipher_entry  -side left -padx 2 -fill x -expand 1

pack .nb.decr_fr.param -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.decr_fr.param.key_lab -side left -padx 2
pack .nb.decr_fr.param.key_entry -side left -padx 2 -fill x -expand 1
pack .nb.decr_fr.param.cb -side left 
pack .nb.decr_fr.param.exec_button -side left -padx 3

pack .nb.decr_fr.plain_frame -fill both -expand 1 -ipadx 10 -ipady 10
pack .nb.decr_fr.plain_frame.plain_entry -fill x -expand 1 -pady 1 -padx 3

pack .nb.decr_fr.exit_button -fill none -pady 5 -padx 3 -ipadx 30

# --------------------------------------------

set selected 1

.nb add .nb.enc_fr -text "Encryption"
.nb add .nb.decr_fr -text "Decryption"
.nb select .nb.enc_fr
ttk::notebook::enableTraversal .nb

pack .nb

wm title . "One-liner AES encryption - Janusz Nawrat (2015)"
wm protocol . WM_DELETE_WINDOW {exit}
wm resizable . 0 0

Oto kod skryptu Blowfish One-liner:

package require blowfish
package require base64

proc encrypt {key plaintext} {
   global mode
   set ciphertext [blowfish::blowfish -mode $mode -dir encrypt -key $key "$plaintext"]
   set ciphertext [::base64::encode $ciphertext]
   return $ciphertext
}

proc decrypt {key ciphertext} {
   global mode
   set ciphertext [::base64::decode $ciphertext]
   set plaintext [blowfish::blowfish -mode $mode -dir decrypt -key $key "$ciphertext"]
   return $plaintext
}

proc asterix  {entry_widget checkvalue} {
   global selected
   if {$checkvalue == 0} {
      $entry_widget configure -show *
      set selected 0
   } else {
      $entry_widget configure -show ""
      set selected 1
   }
}

proc OnComboSelected {widget} {
   global cryptmode
   set cryptmode [$widget get]
   # tk_messageBox -message "Cryptomode: $cryptmode" -title {Info}
}

set plaintext ""; set ciphertext ""; set key "S3cYouRe"; set mode "ecb"

ttk::notebook .nb

# -------------- Encryption ------------------

frame .nb.enc_fr
labelframe .nb.enc_fr.plain_frame -text "Plaintext"
label .nb.enc_fr.plain_frame.lab -text "Enter plaintext"
entry .nb.enc_fr.plain_frame.plain_entry -textvariable plaintext -width 35

frame .nb.enc_fr.param
label .nb.enc_fr.param.key_lab -text "Crypto key"
entry .nb.enc_fr.param.key_entry -textvariable key
checkbutton .nb.enc_fr.param.cb -text "Show password" -command {asterix .nb.enc_fr.param.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected

label .nb.enc_fr.param.mode_lbl -text "|  Mode "
ttk::combobox .nb.enc_fr.param.crypt_mode -textvariable cryptmode -values {ecb cbc} -width 10
bind .nb.enc_fr.param.crypt_mode <> [list OnComboSelected .nb.enc_fr.param.crypt_mode]
         
button .nb.enc_fr.param.exec_button -text "Encrypt it..." -command { set ciphertext [encrypt $key $plaintext] }

labelframe .nb.enc_fr.cipher_frame -text "Ciphertext"
entry .nb.enc_fr.cipher_frame.cipher_entry -textvariable ciphertext

set normal_font [.nb.enc_fr.cipher_frame.cipher_entry cget -font]
font create bolden_font -family $normal_font -weight bold -size 10

.nb.enc_fr.cipher_frame.cipher_entry configure -bg red -fg yellow -font bolden_font

button .nb.enc_fr.exit_button -text "Exit" -command {exit}

pack .nb.enc_fr.plain_frame -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.enc_fr.plain_frame.lab -side left -padx 3
pack .nb.enc_fr.plain_frame.plain_entry -side left -padx 2 -fill x -expand 1

pack .nb.enc_fr.param -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.enc_fr.param.key_lab -side left -padx 2
pack .nb.enc_fr.param.key_entry -side left -padx 2 -fill x -expand 1
pack .nb.enc_fr.param.cb -side left 
pack .nb.enc_fr.param.mode_lbl -side left
pack .nb.enc_fr.param.crypt_mode -side left
pack .nb.enc_fr.param.exec_button -side left -padx 3

pack .nb.enc_fr.cipher_frame -fill both -expand 1 -ipadx 10 -ipady 10
pack .nb.enc_fr.cipher_frame.cipher_entry -fill x -expand 1 -pady 1 -padx 3

pack .nb.enc_fr.exit_button -fill none -pady 5 -padx 3 -ipadx 30

# -------------- Decryption ------------------

frame .nb.decr_fr
labelframe .nb.decr_fr.cipher_frame -text "Ciphertext"
label .nb.decr_fr.cipher_frame.lab -text "Enter ciphertext"
entry .nb.decr_fr.cipher_frame.cipher_entry -textvariable ciphertext

frame .nb.decr_fr.param
label .nb.decr_fr.param.key_lab -text "Crypto key"
entry .nb.decr_fr.param.key_entry -textvariable key
checkbutton .nb.decr_fr.param.cb -text "Show password" -command {asterix .nb.decr_fr.param.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected

label .nb.decr_fr.param.mode_lbl -text "|  Mode "
ttk::combobox .nb.decr_fr.param.crypt_mode -textvariable cryptmode -values {ecb cbc} -width 10
bind .nb.decr_fr.param.crypt_mode <> [list OnComboSelected .nb.decr_fr.param.crypt_mode]

label .nb.decr_fr.cipher_frame.key_lab -text "Crypto key"
entry .nb.decr_fr.cipher_frame.key_entry -textvariable key
checkbutton .nb.decr_fr.cipher_frame.cb -text "Show password" -command {asterix .nb.decr_fr.cipher_frame.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected
         
button .nb.decr_fr.param.exec_button -text "Decrypt it..." -command { set plaintext [decrypt $key $ciphertext] }

labelframe .nb.decr_fr.plain_frame -text "Plaintext"
entry .nb.decr_fr.plain_frame.plain_entry -textvariable plaintext

.nb.decr_fr.plain_frame.plain_entry configure -bg red -fg yellow -font bolden_font

button .nb.decr_fr.exit_button -text "Exit" -command {exit}

pack .nb.decr_fr.cipher_frame -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.decr_fr.cipher_frame.lab -side left -padx 3
pack .nb.decr_fr.cipher_frame.cipher_entry  -side left -padx 2 -fill x -expand 1

pack .nb.decr_fr.param -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.decr_fr.param.key_lab -side left -padx 2
pack .nb.decr_fr.param.key_entry -side left -padx 2 -fill x -expand 1
pack .nb.decr_fr.param.cb -side left 
pack .nb.decr_fr.param.mode_lbl -side left
pack .nb.decr_fr.param.crypt_mode -side left
pack .nb.decr_fr.param.exec_button -side left -padx 3

pack .nb.decr_fr.plain_frame -fill both -expand 1 -ipadx 10 -ipady 10
pack .nb.decr_fr.plain_frame.plain_entry -fill x -expand 1 -pady 1 -padx 3

pack .nb.decr_fr.exit_button -fill none -pady 5 -padx 3 -ipadx 30

# --------------------------------------------

set selected 1

.nb add .nb.enc_fr -text "Encryption"
.nb add .nb.decr_fr -text "Decryption"
.nb select .nb.enc_fr
ttk::notebook::enableTraversal .nb

pack .nb

wm title . "One-liner Blowfish encryption - Janusz Nawrat (2015)"
wm protocol . WM_DELETE_WINDOW {exit}
wm resizable . 0 0

Oto kod skryptu AES Multiliner:

package require aes
package require base64

proc encrypt {key plaintext} {
   if {[ string length $key] < 16} {
      set key [format "%-16s" $key]
   } else {
      set key [string range $key 0 15]
   }
   # tk_messageBox -message "Key :$key:" -title {Info}
   set ciphertext [aes::aes -dir encrypt -key $key "$plaintext"]
   set ciphertext [::base64::encode $ciphertext]
   return $ciphertext
}

proc decrypt {key ciphertext} {
   if {[ string length $key] < 16} {
      set key [format "%-16s" $key]
   } else {
      set key [string range $key 0 15]
   }
   set ciphertext [::base64::decode $ciphertext]
   set plaintext [aes::aes -dir decrypt -key $key "$ciphertext"]
   return $plaintext
}

proc asterix  {entry_widget checkvalue} {
   global selected
   if {$checkvalue == 0} {
      $entry_widget configure -show *
      set selected 0
   } else {
      $entry_widget configure -show ""
      set selected 1
   }
}

set plaintext ""; set ciphertext ""; set key "S3cYouRe";

ttk::notebook .nb

# -------------- Encryption ------------------

frame .nb.enc_fr
labelframe .nb.enc_fr.plain_frame -text "Plaintext"

text .nb.enc_fr.plain_frame.txt -yscrollcommand ".srl_ya set" -xscrollcommand ".srl_xa set" -wrap none -height 10
scrollbar .srl_ya -command ".nb.enc_fr.plain_frame.txt yview" -orient v
scrollbar .srl_xa -command ".nb.enc_fr.plain_frame.txt xview" -orient h

frame .nb.enc_fr.param
label .nb.enc_fr.param.key_lab -text "Crypto key"
entry .nb.enc_fr.param.key_entry -textvariable key
checkbutton .nb.enc_fr.param.cb -text "Show password" -command {asterix .nb.enc_fr.param.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected
         
button .nb.enc_fr.param.exec_button -text "Encrypt it..." -command { set plaintext [.nb.enc_fr.plain_frame.txt get 1.0 end]; \
        set ciphertext [encrypt $key $plaintext]; .nb.enc_fr.cipher_frame.txt delete 1.0 end; \
      .nb.enc_fr.cipher_frame.txt insert 1.0 $ciphertext; }

labelframe .nb.enc_fr.cipher_frame -text "Ciphertext"
text .nb.enc_fr.cipher_frame.txt -yscrollcommand ".srl_yb set" -xscrollcommand ".srl_xb set" -wrap none -height 10
scrollbar .srl_yb -command ".nb.enc_fr.cipher_frame.txt yview" -orient v
scrollbar .srl_xb -command ".nb.enc_fr.cipher_frame.txt xview" -orient h

button .nb.enc_fr.exit_button -text "Exit" -command {exit}

pack .nb.enc_fr.plain_frame -fill both -expand 1 -ipadx 5 -ipady 5
pack .srl_ya -in .nb.enc_fr.plain_frame -fill y -side right -expand 1
pack .srl_xa -in .nb.enc_fr.plain_frame -fill x -side bottom -expand 1
pack .nb.enc_fr.plain_frame.txt -side left -expand 1 -fill both

pack .nb.enc_fr.param -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.enc_fr.param.key_lab -side left -padx 2
pack .nb.enc_fr.param.key_entry -side left -padx 2 -fill x -expand 1
pack .nb.enc_fr.param.cb -side left 

pack .nb.enc_fr.param.exec_button -side left -padx 3

pack .nb.enc_fr.cipher_frame -fill both -expand 1 -ipadx 5 -ipady 5
pack .srl_yb -in .nb.enc_fr.cipher_frame -fill y -side right -expand 1
pack .srl_xb -in .nb.enc_fr.cipher_frame -fill x -side bottom -expand 1
pack .nb.enc_fr.cipher_frame.txt -side left -expand 1 -fill both

pack .nb.enc_fr.exit_button -fill none -pady 5 -padx 3 -ipadx 30

# -------------- Decryption ------------------

frame .nb.decr_fr
labelframe .nb.decr_fr.cipher_frame -text "Ciphertext"

text .nb.decr_fr.cipher_frame.txt -yscrollcommand ".srl_yc set" -xscrollcommand ".srl_xc set" -wrap none -height 10
scrollbar .srl_yc -command ".nb.decr_fr.cipher_frame.txt yview" -orient v
scrollbar .srl_xc -command ".nb.decr_fr.cipher_frame.txt xview" -orient h

frame .nb.decr_fr.param
label .nb.decr_fr.param.key_lab -text "Crypto key"
entry .nb.decr_fr.param.key_entry -textvariable key
checkbutton .nb.decr_fr.param.cb -text "Show password" -command {asterix .nb.decr_fr.param.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected

label .nb.decr_fr.cipher_frame.key_lab -text "Crypto key"
entry .nb.decr_fr.cipher_frame.key_entry -textvariable key
checkbutton .nb.decr_fr.cipher_frame.cb -text "Show password" -command {asterix .nb.decr_fr.cipher_frame.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected
         
button .nb.decr_fr.param.exec_button -text "Decrypt it..." -command { set ciphertext [.nb.decr_fr.cipher_frame.txt get 1.0 end]; \
        set plaintext [decrypt $key $ciphertext]; .nb.decr_fr.plain_frame.txt delete 1.0 end; \
      .nb.decr_fr.plain_frame.txt insert 1.0 $plaintext; }


labelframe .nb.decr_fr.plain_frame -text "Plaintext"

text .nb.decr_fr.plain_frame.txt -yscrollcommand ".srl_yd set" -xscrollcommand ".srl_xd set" -wrap none -height 10
scrollbar .srl_yd -command ".nb.decr_fr.plain_frame.txt yview" -orient v
scrollbar .srl_xd -command ".nb.decr_fr.plain_frame.txt xview" -orient h

button .nb.decr_fr.exit_button -text "Exit" -command {exit}

pack .nb.decr_fr.cipher_frame -fill both -expand 1 -ipadx 5 -ipady 5

pack .srl_yc -in .nb.decr_fr.cipher_frame -fill y -side right -expand 1
pack .srl_xc -in .nb.decr_fr.cipher_frame -fill x -side bottom -expand 1
pack .nb.decr_fr.cipher_frame.txt -side left -expand 1 -fill both

pack .nb.decr_fr.param -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.decr_fr.param.key_lab -side left -padx 2
pack .nb.decr_fr.param.key_entry -side left -padx 2 -fill x -expand 1
pack .nb.decr_fr.param.cb -side left 
pack .nb.decr_fr.param.exec_button -side left -padx 3

pack .nb.decr_fr.plain_frame -fill both -expand 1 -ipadx 10 -ipady 10

pack .srl_yd -in .nb.decr_fr.plain_frame -fill y -side right -expand 1
pack .srl_xd -in .nb.decr_fr.plain_frame -fill x -side bottom -expand 1
pack .nb.decr_fr.plain_frame.txt -side left -expand 1 -fill both

pack .nb.decr_fr.exit_button -fill none -pady 5 -padx 3 -ipadx 30

# --------------------------------------------

set selected 1

.nb add .nb.enc_fr -text "Encryption"
.nb add .nb.decr_fr -text "Decryption"
.nb select .nb.enc_fr
ttk::notebook::enableTraversal .nb

pack .nb

wm title . "Multi-liner AES encryption/decryption - Janusz Nawrat (2015)"
wm protocol . WM_DELETE_WINDOW {exit}
wm resizable . 0 0

Oto kod skryptu Blowfish Multiliner:

package require blowfish
package require base64

proc encrypt {key plaintext} {
   global mode
   set ciphertext [blowfish::blowfish -mode $mode -dir encrypt -key $key "$plaintext"]
   set ciphertext [::base64::encode $ciphertext]
   return $ciphertext
}

proc decrypt {key ciphertext} {
   global mode
   set ciphertext [::base64::decode $ciphertext]
   set plaintext [blowfish::blowfish -mode $mode -dir decrypt -key $key "$ciphertext"]
   return $plaintext
}

proc asterix  {entry_widget checkvalue} {
   global selected
   if {$checkvalue == 0} {
      $entry_widget configure -show *
      set selected 0
   } else {
      $entry_widget configure -show ""
      set selected 1
   }
}

proc OnComboSelected {widget} {
   global cryptmode
   set cryptmode [$widget get]
}

set plaintext ""; set ciphertext ""; set key "S3cYouRe"; set mode "ecb"

ttk::notebook .nb

# -------------- Encryption ------------------

frame .nb.enc_fr
labelframe .nb.enc_fr.plain_frame -text "Plaintext"

text .nb.enc_fr.plain_frame.txt -yscrollcommand ".srl_ya set" -xscrollcommand ".srl_xa set" -wrap none -height 10
scrollbar .srl_ya -command ".nb.enc_fr.plain_frame.txt yview" -orient v
scrollbar .srl_xa -command ".nb.enc_fr.plain_frame.txt xview" -orient h

frame .nb.enc_fr.param
label .nb.enc_fr.param.key_lab -text "Crypto key"
entry .nb.enc_fr.param.key_entry -textvariable key
checkbutton .nb.enc_fr.param.cb -text "Show password" -command {asterix .nb.enc_fr.param.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected

label .nb.enc_fr.param.mode_lbl -text "|  Mode "
ttk::combobox .nb.enc_fr.param.crypt_mode -textvariable cryptmode -values {ecb cbc} -width 10
bind .nb.enc_fr.param.crypt_mode <> [list OnComboSelected .nb.enc_fr.param.crypt_mode]
         
button .nb.enc_fr.param.exec_button -text "Encrypt it..." -command { set plaintext [.nb.enc_fr.plain_frame.txt get 1.0 end]; \
        set ciphertext [encrypt $key $plaintext]; .nb.enc_fr.cipher_frame.txt delete 1.0 end; \
      .nb.enc_fr.cipher_frame.txt insert 1.0 $ciphertext; }

labelframe .nb.enc_fr.cipher_frame -text "Ciphertext"
text .nb.enc_fr.cipher_frame.txt -yscrollcommand ".srl_yb set" -xscrollcommand ".srl_xb set" -wrap none -height 10
scrollbar .srl_yb -command ".nb.enc_fr.cipher_frame.txt yview" -orient v
scrollbar .srl_xb -command ".nb.enc_fr.cipher_frame.txt xview" -orient h

button .nb.enc_fr.exit_button -text "Exit" -command {exit}

pack .nb.enc_fr.plain_frame -fill both -expand 1 -ipadx 5 -ipady 5
pack .srl_ya -in .nb.enc_fr.plain_frame -fill y -side right -expand 1
pack .srl_xa -in .nb.enc_fr.plain_frame -fill x -side bottom -expand 1
pack .nb.enc_fr.plain_frame.txt -side left -expand 1 -fill both

pack .nb.enc_fr.param -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.enc_fr.param.key_lab -side left -padx 2
pack .nb.enc_fr.param.key_entry -side left -padx 2 -fill x -expand 1
pack .nb.enc_fr.param.cb -side left 
pack .nb.enc_fr.param.mode_lbl -side left
pack .nb.enc_fr.param.crypt_mode -side left
pack .nb.enc_fr.param.exec_button -side left -padx 3

pack .nb.enc_fr.cipher_frame -fill both -expand 1 -ipadx 5 -ipady 5
pack .srl_yb -in .nb.enc_fr.cipher_frame -fill y -side right -expand 1
pack .srl_xb -in .nb.enc_fr.cipher_frame -fill x -side bottom -expand 1
pack .nb.enc_fr.cipher_frame.txt -side left -expand 1 -fill both

pack .nb.enc_fr.exit_button -fill none -pady 5 -padx 3 -ipadx 30

# -------------- Decryption ------------------

frame .nb.decr_fr
labelframe .nb.decr_fr.cipher_frame -text "Ciphertext"

text .nb.decr_fr.cipher_frame.txt -yscrollcommand ".srl_yc set" -xscrollcommand ".srl_xc set" -wrap none -height 10
scrollbar .srl_yc -command ".nb.decr_fr.cipher_frame.txt yview" -orient v
scrollbar .srl_xc -command ".nb.decr_fr.cipher_frame.txt xview" -orient h

frame .nb.decr_fr.param
label .nb.decr_fr.param.key_lab -text "Crypto key"
entry .nb.decr_fr.param.key_entry -textvariable key
checkbutton .nb.decr_fr.param.cb -text "Show password" -command {asterix .nb.decr_fr.param.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected

label .nb.decr_fr.param.mode_lbl -text "|  Mode "
ttk::combobox .nb.decr_fr.param.crypt_mode -textvariable cryptmode -values {ecb cbc} -width 10
bind .nb.decr_fr.param.crypt_mode <> [list OnComboSelected .nb.decr_fr.param.crypt_mode]

label .nb.decr_fr.cipher_frame.key_lab -text "Crypto key"
entry .nb.decr_fr.cipher_frame.key_entry -textvariable key
checkbutton .nb.decr_fr.cipher_frame.cb -text "Show password" -command {asterix .nb.decr_fr.cipher_frame.key_entry $selected} \
            -onvalue 1 -offvalue 0 -variable selected
         
button .nb.decr_fr.param.exec_button -text "Decrypt it..." -command { set ciphertext [.nb.decr_fr.cipher_frame.txt get 1.0 end]; \
        set plaintext [decrypt $key $ciphertext]; .nb.decr_fr.plain_frame.txt delete 1.0 end; \
      .nb.decr_fr.plain_frame.txt insert 1.0 $plaintext; }


labelframe .nb.decr_fr.plain_frame -text "Plaintext"

text .nb.decr_fr.plain_frame.txt -yscrollcommand ".srl_yd set" -xscrollcommand ".srl_xd set" -wrap none -height 10
scrollbar .srl_yd -command ".nb.decr_fr.plain_frame.txt yview" -orient v
scrollbar .srl_xd -command ".nb.decr_fr.plain_frame.txt xview" -orient h

button .nb.decr_fr.exit_button -text "Exit" -command {exit}

pack .nb.decr_fr.cipher_frame -fill both -expand 1 -ipadx 5 -ipady 5

pack .srl_yc -in .nb.decr_fr.cipher_frame -fill y -side right -expand 1
pack .srl_xc -in .nb.decr_fr.cipher_frame -fill x -side bottom -expand 1
pack .nb.decr_fr.cipher_frame.txt -side left -expand 1 -fill both

pack .nb.decr_fr.param -fill both -expand 1 -ipadx 5 -ipady 5
pack .nb.decr_fr.param.key_lab -side left -padx 2
pack .nb.decr_fr.param.key_entry -side left -padx 2 -fill x -expand 1
pack .nb.decr_fr.param.cb -side left 
pack .nb.decr_fr.param.mode_lbl -side left
pack .nb.decr_fr.param.crypt_mode -side left
pack .nb.decr_fr.param.exec_button -side left -padx 3

pack .nb.decr_fr.plain_frame -fill both -expand 1 -ipadx 10 -ipady 10

pack .srl_yd -in .nb.decr_fr.plain_frame -fill y -side right -expand 1
pack .srl_xd -in .nb.decr_fr.plain_frame -fill x -side bottom -expand 1
pack .nb.decr_fr.plain_frame.txt -side left -expand 1 -fill both

pack .nb.decr_fr.exit_button -fill none -pady 5 -padx 3 -ipadx 30

# --------------------------------------------

set selected 1

.nb add .nb.enc_fr -text "Encryption"
.nb add .nb.decr_fr -text "Decryption"
.nb select .nb.enc_fr
ttk::notebook::enableTraversal .nb

pack .nb

wm title . "Multi-liner Blowfish encryption/decryption - Janusz Nawrat (2015)"
wm protocol . WM_DELETE_WINDOW {exit}
wm resizable . 0 0

Informacje Janusz Nawrat
Just ordinary man who likes thinking...

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

TOMASZ WEŁNA

artysta grafik | wykładowca

PRACOWNIA OKO

Szkoła Rysunku Malarstwa i Grafiki DR TOMASZA WEŁNY | KRAKÓW | Plac Matejki 10 | tel 691 81 75 74

Piękno neurobiologii

Blog Jerzego Vetulaniego

Teoria muzyki, zasady muzyki, podstawy muzyki

Teoria muzyki, zasady muzyki, podstawy muzyki - czyli to co każdy amator muzyki wiedzieć powinien :)

Personal Development & Inspirations

Przemyślenia i refleksje, którymi warto się podzielić (blog by Janusz Nawrat)

Business IT Cooperation Platform

Biznes i IT - dwa światy, które muszą współdziałać

%d bloggers like this: