{"id":5534,"date":"2012-09-12T20:44:27","date_gmt":"2012-09-13T00:44:27","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=5534"},"modified":"2024-07-11T06:33:18","modified_gmt":"2024-07-11T10:33:18","slug":"15c-de","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/15c-de\/","title":{"rendered":"15C: Caesar-Chiffre"},"content":{"rendered":"<p><em>Die Aufgaben 15A, 15B, und 15C k\u00f6nnen in beliebiger Reihenfolge bearbeitet werden.<\/em><\/p>\n<p>Kryptographie ist die Kunst und Wissenschaft des Verbergens von Information, auf solch eine Art und Weise, dass nur bestimmte Leute es sehen k\u00f6nnen. In dieser Lektion werden wir eine der einfachsten kryptographischen Methoden einf\u00fchren, die <strong><a href=\"http:\/\/de.wikipedia.org\/wiki\/Caesar-Verschl%C3%BCsselung\">Caesar-Verschl\u00fcsselung<\/a> <\/strong> (auch bekannt als eine sogenannte <strong>Verschiebechiffre<\/strong>), und du wirst lernen, wie man ein Programm schreibt, das diese Verschl\u00fcsselung bricht. Du wirst jeden Aspekt deiner L\u00f6sung selbst entwerfen (im Gegensatz zu Lektion 15A, die wir in Unterkapitel unterbrochen hatten)<\/p>\n<p>Die Caesar-Verschl\u00fcsselung funktioniert, indem man jeden Buchstaben des Alphabets durch einen anderen Buchstaben ersetzt. Genauer gesagt bedeutet das, dass, wenn du einen Text kodieren m\u00f6chtest, du jedesmal einen <strong>Verschiebungswert<\/strong><em> S<\/em> w\u00e4hlen musst, der eine Zahl zwischen 0 und 25 ist. Dann ersetzt du jeden Buchstaben im Text mit dem Buchstaben, der <em>S<\/em> Stellen sp\u00e4ter im Alphabet steht, wobei du nat\u00fcrlich wieder am Anfang beginnen musst, nachdem du Z am Ende des Alphabets erreicht hast.<\/p>\n<h2>Beispiel<\/h2>\n<p>Nehmen wir an, wir wollen die geheime Botschaft<\/p>\n<p style=\"text-align: center;\"><code>JOIN ME AT EIGHT BY THE ZOO<\/code><\/p>\n<p>kodieren, und wir verwenden den Verschiebungswert <em>S<\/em>=2.<br \/>\nDie Verschl\u00fcsselungsregel besagt, dass jeder Buchstabe ersetzt wird durch den Buchstaben, der zwei Stellen sp\u00e4ter im Alphabet kommt. Zum Beispiel, da das Alphabet folgenderma\u00dfen aussieht: ABCDEFGHI<strong>J<\/strong>K<strong>L<\/strong>..., wird der erste Buchstabe <code>J<\/code> durch den Buchstaben <code>L<\/code> ersetzt. Des Weiteren ersetzen wir <code>O<\/code> durch <code>Q<\/code>, <code>I<\/code> durch <code>K<\/code>, etc. Um den Buchstaben Y zu verschl\u00fcsseln, m\u00fcssen wir zur\u00fcck zum Anfang: nach Y kommt Z, dann A, also ersetzen wir <code>Y<\/code> durch <code>A<\/code>. Dem selben Prinzip folgend wird <code>Z<\/code> durch <code>B<\/code> ersetzt. Also ist die verschl\u00fcsselte Version unserer Geheimbotschaft:<\/p>\n<p style=\"text-align: center;\"><code>LQKP OG CV GKIJV DA VJG BQQ<\/code><\/p>\n<p>Wenn Spione diese Nachricht sehen w\u00fcrden, w\u00e4re es ihnen nicht auf Anhieb klar, was deine Botschaft w\u00e4re.<\/p>\n<div class='pybox modeNeutral' id='pybox0'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Short Answer Exercise: <\/span><span class='title'>SPY CODER<\/span><\/div>Was ist das Resultat davon, wenn wir <code>SPY CODER<\/code> mit dem Verschiebungswert <em>S<\/em>=5 verschl\u00fcsseln? (Wichtig: Verwende Gro\u00dfbuchstaben) Du kannst ein Programm in der <a href=\"\/console\/\">Konsole<\/a> schreiben, um dies zu berechnen, wenn du m\u00f6chtest, es k\u00f6nnte sp\u00e4ter hilfreich sein.<br><label for=\"pyShortAnswer0\">Your answer: <\/label><input type=\"text\" onkeypress=\"{if (event.keyCode==13) pbShortCheck(0)}\" id=\"pyShortAnswer0\"><div class=\"pyboxbuttons\"><input type=\"hidden\" name=\"type\" value=\"trimmableString\"\/><input type=\"hidden\" name=\"correct\" value=\"XUD HTIJW\"\/><input type=\"hidden\" name=\"slug\" value=\"15c.encode\"\/><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick = 'pbShortCheck(0)'\/><\/div><div class=\"pbresults\" id=\"pyShortResults0\"><\/div><div class=\"epilogue\">Correct!<\/div><\/div>\n<h2>Entschl\u00fcsselung<\/h2>\n<p>Wenn dein Freund den geheimen Verschiebungswert S kennt, kann er die Nachricht mit Leichtigkeit entschl\u00fcsseln: er ersetzt einfach jeden Buchstaben durch denjenigen, der <em>S<\/em> Stellen <em>fr\u00fcher<\/em> im Alphabet kommt. Zum Beispiel w\u00fcrde dieser Freund <code>L<\/code> betrachten, zwei Stellen im Alphabet r\u00fcckw\u00e4rts gehen und <code>J<\/code> finden, von dem er jetzt w\u00fc\u00dfte, dass es der erste Buchstabe deiner Geheimbotschaft ist. Es ist nat\u00fcrlich wieder so, dass das Alphabet als zyklisch betrachtet wird, so dass <code>Z<\/code> vor <code>A<\/code> kommt, wie bereits im obigen Beispiel dargestellt.<\/p>\n<p><div class='pybox modeNeutral' id='pybox1'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Short Answer Exercise: <\/span><span class='title'>Spy Decoder<\/span><\/div>Wenn die verschl\u00fcsselte Botschaft <code>HUD<\/code> ist, und der Verschiebungswert <em>S<\/em>=6, was war die urspr\u00fcngliche Botschaft? (Wichtig: Verwende Gro\u00dfbuchstaben))<br><label for=\"pyShortAnswer1\">Your answer: <\/label><input type=\"text\" onkeypress=\"{if (event.keyCode==13) pbShortCheck(1)}\" id=\"pyShortAnswer1\"><div class=\"pyboxbuttons\"><input type=\"hidden\" name=\"type\" value=\"trimmableString\"\/><input type=\"hidden\" name=\"correct\" value=\"BOX\"\/><input type=\"hidden\" name=\"slug\" value=\"15c.decode\"\/><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick = 'pbShortCheck(1)'\/><\/div><div class=\"pbresults\" id=\"pyShortResults1\"><\/div><div class=\"epilogue\">Correct!<\/div><\/div>\n<h2>F\u00fcr die andere Seite arbeiten<\/h2>\n<p>Du wurdest von einem Spion angeheuert, um eine Botschaft entschl\u00fcsseln zu helfen, die mit einer Verschiebechiffre verschl\u00fcsselt wurde. \u00c4rgerlicherweise wei\u00df der Spion nicht, was der Wert von <em>S<\/em> ist. Du wirst also Statistik benutzen m\u00fcssen, um ein Programm zu schreiben, das eine gute Chance darauf hat, automatisch den richtigen Wert f\u00fcr <em>S<\/em> herauszubekommen.<\/p>\n<p>Wir werden uns der <strong>Buchstabenh\u00e4ufigkeit<\/strong> bedienen. Im Englischen, wie auch im Deutschen, sind manche Buchstaben sehr h\u00e4ufig (wie E) und andere sehr selten (wie J). Hier ist eine Tabelle mit H\u00e4ufigkeitswerten, die auf dem Z\u00e4hlen von vorkommenden Buchstaben in einer gro\u00dfen Menge von Texten beruht:<\/p>\n<table class=\"minyspace\" style=\"text-align: center;\">\n<tbody>\n<tr>\n<th>A<\/th>\n<th>B<\/th>\n<th>C<\/th>\n<th>D<\/th>\n<th>E<\/th>\n<th>F<\/th>\n<th>G<\/th>\n<th>H<\/th>\n<th>I<\/th>\n<\/tr>\n<tr>\n<td>.0817<\/td>\n<td>.0149<\/td>\n<td>.0278<\/td>\n<td>.0425<\/td>\n<td>.1270<\/td>\n<td>.0223<\/td>\n<td>.0202<\/td>\n<td>.0609<\/td>\n<td>.0697<\/td>\n<\/tr>\n<tr>\n<th>J<\/th>\n<th>K<\/th>\n<th>L<\/th>\n<th>M<\/th>\n<th>N<\/th>\n<th>O<\/th>\n<th>P<\/th>\n<th>Q<\/th>\n<th>R<\/th>\n<\/tr>\n<tr>\n<td>.0015<\/td>\n<td>.0077<\/td>\n<td>.0402<\/td>\n<td>.0241<\/td>\n<td>.0675<\/td>\n<td>.0751<\/td>\n<td>.0193<\/td>\n<td>.0009<\/td>\n<td>.0599<\/td>\n<\/tr>\n<tr>\n<th>S<\/th>\n<th>T<\/th>\n<th>U<\/th>\n<th>V<\/th>\n<th>W<\/th>\n<th>X<\/th>\n<th>Y<\/th>\n<th>Z<\/th>\n<th><\/th>\n<\/tr>\n<tr>\n<td>.0633<\/td>\n<td>.0906<\/td>\n<td>.0276<\/td>\n<td>.0098<\/td>\n<td>.0236<\/td>\n<td>.0015<\/td>\n<td>.0197<\/td>\n<td>.0007<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>So tritt im Englischen L zum Beispiel in einer H\u00e4ufigkeit von .0402=4.02% auf, was bedeutet, dass L in einem durchschnittlichen englischen Text 4.02% der Zeit auftaucht.<\/p>\n<p>Bezeichne den Wert eines Buchstaben in der Tabelle oben als <strong>G\u00fcte<\/strong>. Dann, f\u00fcr unsere statistische Methode, definiere die <strong>G\u00fcte<\/strong> eines Satzes so, dass sie gleich der Summe der G\u00fcte jedes Buchstabens in ihm ist. Zum Beispiel ist die G\u00fcte der Kette <code>GOOD<\/code><\/p>\n<p style=\"text-align: center;\">goodness(\"<code>GOOD<\/code>\") = .0202 + .0751 + .0751 + .0425 = .2129<\/p>\n<p>Nun ist es so, dass die Idee hinter einer H\u00e4ufigkeitsanalyse die ist, dass Ketten mit h\u00f6herer G\u00fcte auch mit h\u00f6herer Wahrscheinlichkeit einen sinnvollen Text darstellen. Wenn ein Spion zum Beispiel die verschl\u00fcsselte Botschaft \"<code>JRRG<\/code>\" sieht, k\u00f6nnte das entweder den Originaltext \"<code>GOOD<\/code>\" darstellen, mit dem Verschiebewert <em>S<\/em>=3, oder \"<code>IQQF<\/code>\" mit dem Verschiebewert <em>S<\/em>=1. Aber die G\u00fcte von \"<code>IQQF<\/code>\" ist<\/p>\n<p style=\"text-align: center;\">goodness(\"<code>IQQF<\/code>\") = .0697 + .0009 + .0009 + .0223 = .0938<\/p>\n<p>und da .0938 &lt; .2129, sollte dein Programm zu dem Schluss kommen, dass <code>GOOD<\/code> mit h\u00f6herer Wahrscheinlichkeit die korrekte Botschaft ist als <code>IQQF<\/code>.<\/p>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Die Beurteilung von Ketten durch ihre <em>goodness<\/em> ist nicht perfekt. Wenn zum Beispiel die Geheimbotschaft <code>JAZZ<\/code> w\u00e4re und der geheime Verschiebewert <em>S<\/em>=10 w\u00e4re, dann w\u00e4re der verschl\u00fcsselte Text <code>TKJJ<\/code>. Wenn du nun <code>TKJJ<\/code> in deine L\u00f6sung eingibst, wird sie nat\u00fcrlich <em>S<\/em>=10 versuchen, und <code>JAZZ<\/code> als M\u00f6glichkeit mit einer G\u00fcte von .0846 in betracht ziehen, aber das beste Resultat ist <em>S<\/em>=5, was <code>OFEE<\/code> ergibt, mit einer G\u00fcte von .3514. Dein Programm sollte das Nonsensewort <code>OFEE<\/code> als beste L\u00f6sung ausgeben. (H\u00e4ufigkeitsanalysen wie diese funktionieren besser, wenn die Geheimbotschaft l\u00e4nger ist.) <\/span><\/td><\/table><\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform2\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox2'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Auto-Decryption<\/span><\/div>\n<div>Schreibe ein Programm, welches das folgende macht: zun\u00e4chst sollte es eine Zeile input einlesen, die die verschl\u00fcsselte Nachricht ist, und die aus Gro\u00dfbuchstaben und Leerstellen besteht. Dein Programm muss versuchen, die Botschaft mit allen 26 m\u00f6glichen Werten der Verschiebung <em>S<\/em> zu lesen; aus diesen 26 m\u00f6glichen Originalbotschaften, drucke diejenige aus, die die h\u00f6chste G\u00fcte hat.<\/div>\n<p>Damit es leichter ist f\u00fcr dich, werden wir die Variable <code>letterGoodness<\/code> (also: BuchstabenG\u00fcte) f\u00fcr dich vordefinieren, eine Liste von einer L\u00e4nge von 26, die den Werten in der H\u00e4ufigkeitstabelle weiter oben entspricht.<\/p>\n<pre>letterGoodness = [.0817,.0149,.0278,.0425,.1270,.0223,.0202,...<\/pre>\n<div><a class=\"hintlink\"  id=\"hintlink3\">Klick hier um einen allgemeinen Ratschlag zu erhalten.<\/a><div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode2' id='usercode2'  cols=10 rows=20   class='pyboxCode RW'>\nprint(letterGoodness) #testing... it's predefined\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory2' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput2\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<input type='hidden' id='defaultCode2' value='print(letterGoodness) #testing... it\\u0027s predefined\\n'><\/input>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit2' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch2\" value=\"Input Switch\" onclick=\"pbInputSwitch(2,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(2)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(2,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect2' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(2,'15c.autodecrypt')\" >History<\/option>\n<option name='default' data-pbonclick=\"pbSetText(2,descape($('#defaultCode2').val()))\" >Reset code to default<\/option>\n<option name='help' data-pbonclick=\"helpClick(2);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse2\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"2\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"44fbbb6d3ec3e23628a02ce6fc38edd6\"\/>\n<div id='pbresults2' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(2);});pbInputSwitch(2,\"Y\");<\/script>\n<\/div>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Die obige L\u00f6sung nennt man eine <em>brute force<\/em> L\u00f6sung, also eine L\u00f6sung mit Brachialgewalt, da du einfach alle 26 M\u00f6glichkeiten durchprobiert hast. Du h\u00e4ttest das sogar von Hand machen k\u00f6nnen, wenn n\u00f6tig. Moderne kryptographische Protokolle sind hingegen so konstruiert, dass brute force L\u00f6sungen versagen, selbst wenn du sehr schnelle Computer verwendest, um alle M\u00f6glichkeiten auszuprobieren. <\/span><\/td><\/table><\/p>\n<p>Wenn du dieses automatische Decodierungssystem genauer machen wolltest, k\u00f6nntest du andere Statistiken beachten, wie zum Beispiel: \u201ewelche Buchstaben erscheinen wahrscheinlicher nebeneinander? Welche Buchstaben erscheinen wahrscheinlicher am Wortanfang?\u201c Dies ist auch hilfreich bei allgemeineren <a href=\"http:\/\/de.wikipedia.org\/wiki\/Monoalphabetische_Substitution\">monoalphabetischen Substitution<\/a>, wo Buchstaben andere Buchstaben ersetzen, aber nicht auf zyklische Art und Weise. F\u00fcr solche Codes funktioniert Brachialgewalt nicht, da es 26*25*...*1 m\u00f6gliche Substitutionen gibt, was etwa 4 * 10<sup>26<\/sup> entspricht (vierhundert Quatrillionen).<\/p>\n<p>Du hast diese Lektion beendet! Um diesen Erfolg zu feiern, sende ruhig deinen Freunden eine verschl\u00fcsselte Botschaft.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Aufgaben 15A, 15B, und 15C k\u00f6nnen in beliebiger Reihenfolge bearbeitet werden. Kryptographie ist die Kunst und Wissenschaft des Verbergens von Information, auf solch eine Art und Weise, dass nur bestimmte Leute es sehen k\u00f6nnen. In dieser Lektion werden wir &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/15c-de\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2653,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5534","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5534","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/users\/2653"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=5534"}],"version-history":[{"count":14,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5534\/revisions"}],"predecessor-version":[{"id":15951,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/5534\/revisions\/15951"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=5534"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}