# Public-Key-Verschluesselungssystem #Mit diesem Teilprogramm können die Public-Key-Schlüssel ermittelt werden. #Dieses Programm darf natürlich nur der Lehrer als "Zertifikatsstelle" #zur Verfügung haben. # (es werden nur globale Variablen verwendet) # Arno Pasternak, 17.12.2009 # ************************* Prozeduren *************** proc warten_auf_enter {} { puts "" puts "Weiter: " gets stdin weiter puts "" } proc info_ausgeben {} { puts "Mit diesem Progamm koennen fuer die Public-Key-Verschluesselung" puts "die privaten Schluessel" puts "ermittelt werden." puts "" warten_auf_enter } proc satz_eingabe {} { global satz puts "" puts "Bitte den gewuenschten Satz eingeben:" gets stdin satz puts "" satz_ausgabe } proc satz_ausgabe {} { global satz puts "" puts "------------------------------------------------" puts "Der aktuelle Satz lautet: $satz" puts "------------------------------------------------" puts "" } proc satz_verschluesseln {} { public_key_verschluesseln satz_ausgabe } proc satz_entschluesseln {} { public_key_entschluesseln satz_ausgabe } proc schluessel_eingeben {} { global schluessel puts "" puts "Bitte Schluesselzahl eingeben:" gets stdin schluessel puts "" } proc public_key_verschluesseln {} { global satz global schluessel set internercode 123 set stelle 0 set codestelle 0 set internercodestelle 0 set verschluesselter_satz "" set laenge [string length $satz] set codelaenge [string length $schluessel] set internercodelaenge [string length $internercode] while {$stelle < $laenge} { set zeichen [string index $satz $stelle] scan $zeichen %c asciizahl set codezahlzeichen [string index $schluessel $codestelle] scan $codezahlzeichen %c codezahl set codezahl [expr $codezahl -48] set internercodezahlzeichen \ [string index $internercode $internercodestelle] scan $internercodezahlzeichen %c internercodezahl set internercodezahl [expr $internercodezahl -48] set summencodezahl [expr $codezahl + $internercodezahl] if {$summencodezahl > 9} { set summencodezahl [expr $summencodezahl - 10] } set asciizahl [expr $asciizahl + $summencodezahl] set zeichen [format %c $asciizahl] set verschluesselter_satz $verschluesselter_satz$zeichen set stelle [expr $stelle + 1] set codestelle [expr $codestelle +1] set internercodestelle [expr $internercodestelle +1] if {$codestelle == $codelaenge} { set codestelle 0 } if {$internercodestelle == $internercodelaenge} { set internercodestelle 0 } } set satz $verschluesselter_satz } proc public_key_entschluesseln {} { global satz global schluessel set stelle 0 set codestelle 0 set entschluesselter_satz "" set laenge [string length $satz] set codelaenge [string length $schluessel] while {$stelle < $laenge} { set zeichen [string index $satz $stelle] scan $zeichen %c asciizahl set codezahlzeichen [string index $schluessel $codestelle] scan $codezahlzeichen %c codezahl set codezahl [expr $codezahl -48] set asciizahl [expr $asciizahl - $codezahl] set zeichen [format %c $asciizahl] set entschluesselter_satz $entschluesselter_satz$zeichen set stelle [expr $stelle + 1] set codestelle [expr $codestelle +1] if {$codestelle == $codelaenge} { set codestelle 0 } } set satz $entschluesselter_satz } proc privaten_schluessel_ermitteln {} { global schluessel set internercode 123 set laenge [string length $internercode] set codelaenge [string length $schluessel] set codestelle -1 set internercodestelle -1 set privater_code "" while {($internercodestelle != [expr $codelaenge -1]) && ($codestelle != [expr $laenge -1])} { if {$codestelle == $laenge} then { set codestelle 0 } else { set codestelle [expr $codestelle + 1] } if {$internercodestelle == $codelaenge} then { set internercodestelle 0 } else { set internercodestelle [expr $internercodestelle + 1] } set zeichen [string index $schluessel $codestelle] scan $zeichen %c asciizahl set asciizahl [expr $asciizahl - 48] set codezahlzeichen [string index $internercode $internercodestelle] scan $codezahlzeichen %c codezahl set codezahl [expr $codezahl - 48] set asciizahl [expr $asciizahl + $codezahl] if {$asciizahl > 9} then {set asciizahl [expr $asciizahl - 10]} set privater_code $privater_code$asciizahl } puts "Der oeffentliche Schluessel lautet: $schluessel" puts "Der private Schluessel lautet: $privater_code" } proc zweiten_privaten_schluessel_ermitteln {} { global schluessel set internercode 123 set laenge [string length $internercode] set codelaenge [string length $schluessel] set codestelle -1 set internercodestelle -1 set privater_code "" while {($internercodestelle != [expr $codelaenge -1]) && ($codestelle != [expr $laenge -1])} { if {$codestelle == $laenge} then { set codestelle 0 } else { set codestelle [expr $codestelle + 1] } if {$internercodestelle == $codelaenge} then { set internercodestelle 0 } else { set internercodestelle [expr $internercodestelle + 1] } set zeichen [string index $schluessel $codestelle] scan $zeichen %c asciizahl set asciizahl [expr $asciizahl - 48] set codezahlzeichen [string index $internercode $internercodestelle] scan $codezahlzeichen %c codezahl set codezahl [expr $codezahl - 48] set asciizahl [expr $asciizahl - $codezahl] if {$asciizahl < 0} then {set asciizahl [expr $asciizahl + 10]} set privater_code $privater_code$asciizahl } puts "Der oeffentliche Schluessel lautet: $schluessel" puts "Der 2. private Schluessel lautet: $privater_code" } # ************************* Ende der Prozeduren *************** puts \n\n\n\n set pfad "server" puts "PUBLIC-KEY-Verschluesselungssystem" puts "" info_ausgeben puts "" puts "" set codewort "" set satz "" set wahl -1 while {$wahl != 0} { puts "===========================" puts " Menue" puts "===========================" puts "" puts "Informationen ausgeben: i" puts "" puts "Satz eingeben: 1" puts "Privaten Schluessel ermitteln: 2" puts "2. Privaten Schluessel ermitteln: 3" puts "Satz verschluesseln: 4" puts "Satz entschluesseln: 5" puts "" puts "Ende: 0" puts "" puts "" puts "Eingabe:" gets stdin wahl puts "" if {$wahl == "i"} then {info_ausgeben} if {$wahl == 1} then { satz_eingabe } if {$wahl == 2} then { puts "Bitte oeffentlichen Schluessel eingeben:" gets stdin schluessel privaten_schluessel_ermitteln } if {$wahl == 3} then { puts "Bitte oeffentlichen Schluessel eingeben:" gets stdin schluessel zweiten_privaten_schluessel_ermitteln} if {$wahl == 4} then { schluessel_eingeben puts "Unverschluesselt: $satz" satz_verschluesseln } if {$wahl == 5} then { schluessel_eingeben puts "Verschluesselt: $satz" satz_entschluesseln } } # ************************* Ende des Verschlüsselungprogrammes ***************