snichols Below is some Tcl/Tk code for demonstrating how Tcl's blowfish encryption algorythm works. This TK app uses a plain text key field and plain text data field to create an encrypted blowfish data field. This app also allows you to save and load the data fields from file, and could give a basic demonstation on how to write a basic Tk form that asks the user for input from some entry fields, combo box, and command buttons.
Tcl Blowfish caveats I have found through testing:
- If the plain text data field is not divisible by 8 then extra characters are added to the decoded data field when it is decrypted.
- Decoding a plain text data field will actually encrypt it.
- Encrypting an blowfish encoded field will actually decode it.
- Security is based on the plain text field key size. The bigger the key size the better the encryption.
- When saving/opening files the file translation needs to be binary.
package require Tk
package require BWidget
package require blowfish
# Create the window
proc BlowfishTool {} {
global data key mode
set mode cbc
. configure -borderwidth 1
set ::key SECRET
set ::data ""
wm protocol . WM_DELETE_WINDOW {exit}
wm title . "Blowfish Encryption/Decipher Tool"
wm resizable . 1 0
label .k -text "Key:" -anchor w
entry .key -show * -textvar ::key -highlightcolor yellow -highlightthickness 3
label .d -text "Data:" -anchor w
entry .data -textvar ::data -highlightcolor yellow -highlightthickness 3
label .m -text "Mode:" -anchor w
ComboBox .mode -values {cbc ecb} \
-modifycmd [list ComboUpdate .mode] \
-autocomplete true \
-editable false
.mode setvalue @0
button .browser -text Load -command {LoadFile [tk_getOpenFile -filetypes {{"Data File" {.key} }}]} -background red -foreground white
button .e -text "Encrypt Data" -command {Encrypt} -foreground red
button .de -text "Decipher Data" -command {Decrypt} -foreground blue -background white
button .cancel -text Exit -command {exit} -background white -foreground red
grid .k .key - - -sticky news
grid .d .data - - -sticky news
grid .m .mode - - -sticky news
grid .e .de - - -sticky news
grid .browser - - -sticky news
grid .cancel - - -sticky news
grid rowconfigure . 0 -weight 1
grid columnconfigure . 1 -weight 1
raise .
grab set .
focus .data
vwait ::data
button .save -text "Save" -command {SaveFile} -background blue
grid .save - - -sticky news
}
# Event Driven. Called when the mode combobox is clicked.
proc ComboUpdate {p} {
global mode
puts "ComboBox change: [$p cget -text]"
set mode [$p cget -text]
}
# Encode the data
proc Encrypt { } {
global data mode key
set data [blowfish::blowfish -mode $mode -dir encrypt -key $key $data]
}
# Decode the Encrypted data
proc Decrypt { } {
global data mode key
set data [blowfish::blowfish -mode $mode -dir decrypt -key $key $data]
}
# Save the data field.
proc SaveFile { } {
global data
set types {
{"Data Files" {.key} }
}
set file [tk_getSaveFile -filetypes $types -defaultextension .key]
# Only save the file if the user click save not cancel
if {! [string match "" $file ]} {
set fileid [open $file w]
fconfigure $fileid -translation binary
puts $fileid $data
close $fileid
}
}
# Load the data field
proc LoadFile {file} {
global data mode
if {[string match "" $file]} {return}
set fileid [open $file r]
fconfigure $fileid -translation binary
set data [read $fileid]
close $fileid
}
# show background errors
proc bgerror {value} {puts $value}
# Call the main window
BlowfishTool
FYI...The Tcl Blowfish package used in the above sources can be found in TclLib 1.7.0.1 or newer. Any comments you have regarding the above Tcl/Tk code are welcome. Thanks snichols.