# VIGENERE-Verschluesselungssystem # (unter Verwendung von Schnittstellen) # (werden Rückgabewerte benötigt, wird dies mit Funktionen realisiert) # (der 'Server-Pfad' wird als globale Variable verwendet) # Arno Pasternak, 1.7. 2009 # # ************************* Prozeduren *************** proc warten_auf_enter {} { puts "" puts "Weiter: " gets stdin weiter puts "" } proc info_ausgeben {} { puts "Mit diesem Progamm kann die Verschlüsselung" puts "nach Vigenere einzeln oder in einer Gruppe " puts "ausprobiert werden." puts "" puts "Zu Beginn wird eine Zahl als Adresse erfragt." puts "Wird die Nummer beispielsweise mit 100 eingegeben," puts "heisst der Computer dann 'R100'" puts "Es können nun Kurzmitteilungen" puts "(1 Zeile Information) eingegeben werden." puts "Diese kann (mit einem zuvor eingegeben" puts "Codewort) verschlüsselt werden," puts "gespeichert und geladen werden." puts "Als Dateinamen werden immer die Kombinationen:" puts "'RzieladresseRquelladresse.SMS'" puts "verwendet." puts "Es können nur die Dateien geladen werden," puts "die mit dem eigenen Computernamen beginnen." puts "Solche Dateien können auch gelöscht werden." puts "(Der Pfad für die Dateien kann im Programm" puts "festgelegt (verändert) werden." puts "Bei einer Arbeit von Gruppen muss dies " puts "natürlich ein gemeinsam erreichbarer sein.)" warten_auf_enter } proc satz_eingabe {} { puts "" puts "Bitte den gewünschten Satz eingeben:" gets stdin satz puts "" satz_ausgabe $satz return $satz } proc satz_ausgabe {satz} { puts "" puts "------------------------------------------------" puts "Der aktuelle Satz lautet: $satz" puts "------------------------------------------------" puts "" } proc satz_verschluesseln {satz codewort} { set satz [vigenere_verschluesseln $satz $codewort] puts "" satz_ausgabe $satz return $satz } proc satz_entschluesseln {satz codewort} { set satz [vigenere_entschluesseln $satz$ $codewort] puts "" satz_ausgabe $satz return $satz } proc satz_laden {adresse} { global pfad puts "" puts "Eine SMS von welcher Adresse soll gelesen werden?" gets stdin quelladresse set file [open "$pfad/R${adresse}R$quelladresse.SMS" {RDONLY}] gets $file satz close $file puts "" satz_ausgabe $satz return $satz } proc satz_speichern {satz adresse} { global pfad puts "" puts "An welche Zieladresse soll gesendet werden?" gets stdin zieladresse 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 SMS_verzeichnis_ausgeben {adresse} { global pfad set aktueller_pfad [pwd] cd $pfad puts "" puts "Folgende SMS liegen vor:" puts [glob -nocomplain *.SMS] puts "" puts "Folgende SMS liegen für mich vor: " puts [glob -nocomplain R$adresse*.SMS] puts "" puts "" cd $aktueller_pfad } proc SMS_loeschen {adresse} { global pfad puts "Von welcher Adresse soll die SMS gelöscht werden?" gets stdin quelladresse file delete $pfad/R${adresse}R$quelladresse.SMS puts "" } 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 } # ************************* Ende der Prozeduren *************** puts \n\n\n\n set pfad "server" puts "VIGENERE-Verschluesselungssystem" puts "" info_ausgeben puts "" puts "Eigene Adresse (z.B. 312 für R312) eingeben:" gets stdin adresse puts "" puts "" set codewort "" set satz "" set wahl -1 while {$wahl != 0} { puts "===========================" puts " Client: R$adresse" puts "===========================" puts " Menü" puts "===========================" puts "" puts "Informationen ausgeben: i" puts "" puts "Satz eingeben: 1" puts "Satz ausgeben: 2" puts "Satz laden : 3" puts "Satz speichern: 4" puts "Satz verschlüsseln: 5" puts "Satz entschlüsseln: 6" puts "SMS Verzeichnis ausgeben: 7" puts "Codewort eingeben: 8" puts "SMS löschen: 9" puts "Ende: 0" puts "" puts "" puts "Eingabe:" gets stdin wahl puts "" if {$wahl == "i"} then {info_ausgeben} if {$wahl == 1} then {set satz [satz_eingabe]} if {$wahl == 2} then {satz_ausgabe $satz} if {$wahl == 3} then {set satz [satz_laden $adresse]} if {$wahl == 4} then {satz_speichern $satz $adresse} if {$wahl == 5} then {set satz [satz_verschluesseln $satz $codewort]} if {$wahl == 6} then {set satz [satz_entschluesseln $satz $codewort]} if {$wahl == 7} then {SMS_verzeichnis_ausgeben $adresse} if {$wahl == 8} then {set codewort [codewort_eingeben]} if {$wahl == 9} then {SMS_loeschen $adresse} } # ************************* Ende des Verschlüsselungprogrammes ***************