# VIGENERE-Verschluesselungssystem # (unter Verwendung von Schnittstellen) # (werden Rückgabewerte benötigt, wird dies mit Funktionen realisiert) # (der 'Server-Pfad' wird als globale Variable verwendet) # diese Version arbeitet mit einer grafischen Oberfläche # # Arno Pasternak, 8.7. 2009 # # ************************* Prozeduren *************** proc info_anzeigen {} { set info "Mit diesem Progamm kann die Verschlüsselung " set info "${info}nach Vigenere einzeln oder in einer Gruppe " set info "${info}ausprobiert werden.\n\n" set info "${info}Jeder Computer hat eine Adresse. " set info "${info}Wird als Zahl beispielsweise 100 eingegeben, " set info "${info}dann heisst dieser Client entsprechend 'R100' " set info "${info}Es können nun Kurzmitteilungen " set info "${info}(1 Zeile Information) eingegeben werden. " set info "${info}Diese kann mit einem " set info "${info}Codewort verschlüsselt, " set info "${info}gespeichert und geladen werden. " set info "${info}Als Dateinamen werden immer die Kombinationen:\n" set info "${info}'RzieladresseRquelladresse.SMS'\n" set info "${info}verwendet.\n\n" set info "${info}Es können nur die Dateien geladen werden, " set info "${info}die mit dem eigenen Computernamen beginnen. " set info "${info}Solche Dateien können auch gelöscht werden. " set info "${info}(Der Pfad für die Dateien kann im Programm " set info "${info}festgelegt (verändert) werden. " set info "${info}Bei einer Arbeit von Gruppen muss dieser " set info "${info}natürlich ein gemeinsam erreichbarer sein.)" tk_messageBox -message $info } proc satz_laden {adresse quelladresse} { global pfad set file [open "$pfad/R${adresse}R$quelladresse.SMS" {RDONLY}] gets $file satz close $file return $satz } proc satz_speichern {satz adresse zieladresse} { global pfad set file [open "$pfad/R${zieladresse}R$adresse.SMS" {WRONLY CREAT}] puts $file $satz close $file } proc codewort_eingeben {} { puts "" puts "Bitte Codewort eingeben:" gets stdin codewort puts "" return $codewort } proc vigenere_verschluesseln {satz codewort} { set stelle 0 set codewortstelle 0 set verschluesselter_satz "" set codewort [string toupper $codewort] set laenge [string length $satz] set codewortlaenge [string length $codewort] while {$stelle < $laenge} { set zeichen [string index $satz $stelle] scan $zeichen %c asciizahl set verschluesselungszeichen [string index $codewort $codewortstelle] scan $verschluesselungszeichen %c verschluesselungszahl set verschluesselungszahl [expr $verschluesselungszahl -64] set asciizahl [expr $asciizahl + $verschluesselungszahl] set zeichen [format %c $asciizahl] set verschluesselter_satz $verschluesselter_satz$zeichen set stelle [expr $stelle + 1] set codewortstelle [expr $codewortstelle +1] if {$codewortstelle == $codewortlaenge} { set codewortstelle 0 } } return $verschluesselter_satz } proc vigenere_entschluesseln {satz codewort} { set stelle 0 set codewortstelle 0 set entschluesselter_satz "" set codewort [string toupper $codewort] set laenge [string length $satz] set codewortlaenge [string length $codewort] while {$stelle < $laenge} { set zeichen [string index $satz $stelle] scan $zeichen %c asciizahl set entschluesselungszeichen [string index $codewort $codewortstelle] scan $entschluesselungszeichen %c entschluesselungszahl set entschluesselungszahl [expr $entschluesselungszahl -64] set asciizahl [expr $asciizahl - $entschluesselungszahl] set zeichen [format %c $asciizahl] set entschluesselter_satz $entschluesselter_satz$zeichen set stelle [expr $stelle + 1] set codewortstelle [expr $codewortstelle +1] if {$codewortstelle == $codewortlaenge} { set codewortstelle 0 } } return $entschluesselter_satz } proc SMS_verzeichnis_ermitteln {adresse} { global pfad set aktueller_pfad [pwd] cd $pfad set startzeile_1 "Folgende SMS liegen vor:" set alle_sms [glob -nocomplain *.SMS] set startzeile_2 "Folgende SMS liegen für mich vor:" set meine_sms [glob -nocomplain R${adresse}R*.SMS] set SMS_verzeichnis $startzeile_1\n\n$alle_sms\n\n$startzeile_2\n\n$meine_sms\n cd $aktueller_pfad return $SMS_verzeichnis } proc SMS_loeschen {adresse partneradresse} { global pfad file delete $pfad/R${adresse}R$partneradresse.SMS } # ******************* Ende der inhaltlichenProzeduren *************** # ******************* Aufbau der grafischen Oberfläche ************** proc beenden {} { destroy .kopfrahmen destroy .adressrahmen destroy .satzrahmen destroy .codewortrahmen destroy .sms_verzeichnis destroy .menuerahmen destroy .info destroy .schlussrahmen } beenden info_anzeigen set pfad "server" set adresse 17 set partneradresse 0 set satz "Dies ist eine SMS" set codewort "Codewort" set SMS_verzeichnis "Verzeichnis der SMS" frame .kopfrahmen -pady 30 frame .adressrahmen -pady 20 frame .satzrahmen -pady 10 frame .codewortrahmen -pady 10 frame .menuerahmen -pady 5 frame .schlussrahmen -pady 5 label .kopfrahmen.kopflabel -text "Verschlüsselung nach Vigenere" .kopfrahmen.kopflabel configure -font "*-arial-*-*-*-*-26-*-*-*-*-*-*-*" \ -bg black -fg white -relief raised label .adressrahmen.adresslabel -text "Meine eigene Adresse ist R" entry .adressrahmen.adresse -width 6 -relief sunken -textvariable adresse label .adressrahmen.partneradresslabel -text " Die Partner-Adresse ist R" entry .adressrahmen.partneradresse -width 6 -relief sunken \ -textvariable partneradresse entry .satzrahmen.satz -width 50 -relief sunken -textvariable satz .satzrahmen.satz configure -font "*-arial-*-*-*-*-16-*-*-*-*-*-*-*" label .codewortrahmen.codewortlabel -pady 10 \ -text "Das aktuelle Codewort lautet derzeit" entry .codewortrahmen.codewort -width 20 -relief sunken \ -textvariable codewort message .sms_verzeichnis -textvariable SMS_verzeichnis \ -width 475 -bg grey -relief sunken button .menuerahmen.verschluesseln -text Verschlüsseln \ -command {set satz [vigenere_verschluesseln $satz $codewort]} button .menuerahmen.entschluesseln -text Entschlüsseln \ -command {set satz [vigenere_entschluesseln $satz $codewort]} button .menuerahmen.satz_laden -text "SMS laden" \ -command {set satz [satz_laden $adresse $partneradresse]} button .menuerahmen.satz_speichern -text "SMS speichern" \ -command {satz_speichern $satz $adresse $partneradresse set SMS_verzeichnis [SMS_verzeichnis_ermitteln $adresse] } button .menuerahmen.sms_verzeichnis -text "SMS Verzeichnis" \ -command {set SMS_verzeichnis [SMS_verzeichnis_ermitteln $adresse]} button .menuerahmen.sms_loeschen -text "SMS löschen" \ -command {SMS_loeschen $adresse $partneradresse set SMS_verzeichnis [SMS_verzeichnis_ermitteln $adresse] } button .schlussrahmen.info -text "Info anzeigen" -width 20 \ -command {info_anzeigen} button .schlussrahmen.schluss -text "Programm beenden" -width 20 \ -command beenden pack .kopfrahmen pack .kopfrahmen.kopflabel pack .adressrahmen pack .adressrahmen.adresslabel -side left pack .adressrahmen.adresse -side left pack .adressrahmen.partneradresslabel -side left pack .adressrahmen.partneradresse -side left pack .satzrahmen pack .satzrahmen.satz pack .codewortrahmen pack .codewortrahmen.codewortlabel -side left pack .codewortrahmen.codewort -side left pack .sms_verzeichnis pack .menuerahmen pack .menuerahmen.verschluesseln -side left pack .menuerahmen.entschluesseln -side left pack .menuerahmen.satz_laden -side left pack .menuerahmen.satz_speichern -side left pack .menuerahmen.sms_verzeichnis -side left pack .menuerahmen.sms_loeschen -side left pack .schlussrahmen pack .schlussrahmen.info -side left pack .schlussrahmen.schluss -side left # ******************* Ende der grafischen Oberfläche ************** # ************************* Ende des Verschlüsselungprogrammes ***************