{"id":6173,"date":"2012-11-05T20:36:21","date_gmt":"2012-11-06T01:36:21","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=6173"},"modified":"2015-12-02T10:09:45","modified_gmt":"2015-12-02T15:09:45","slug":"15c-nl","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/15c-nl\/","title":{"rendered":"15C: Caesar's JVTIVK JRCRU IVTZGV"},"content":{"rendered":"<p><em>Oefeningen 15A, 15B, en 15C kunnen in een willekeurige volgorde worden gemaakt.<\/em><\/p>\n<p>Cryptografie is de kunst en de wetenschap van het verbergen van de betekenis van informatie, zodat alleen sommige mensen die informatie krijgen. In deze les zullen we \u00e9\u00e9n van de eenvoudigste cryptografische methoden introduceren, de <strong> <a href=\"http:\/\/nl.wikipedia.org\/wiki\/Caesarcijfer\"> Caesarcijfer <\/a> <\/strong> (ook bekend als de <strong>caesarrotatie <\/strong> of kortweg <strong>Rot<\/strong>), en je zult een programma leren schrijven om de code te breken. Je doet dat in \u00e9\u00e9n keer (in tegenstelling tot les 15A, waar we de oplossing in sub-onderdelen opsplitsten).<\/p>\n<p>Cryptografie<br \/>\nBij Caesarcijfer wordt elke letter uit het alfabet vervangen door een andere letter. Nauwkeuriger, wanneer je een tekst wilt coderen, moet je een <strong>verschuivingsgetal<\/strong> <em>S<\/em> kiezen, een getal tussen 0 and 25. Dan vervang je elke letter in de tekst door de letter die <em>S<\/em> posities later in het alfabet staat en waarbij je teruggaat naar het begin van het alfabet wanneer je Z, het einde van het alfabet, hebt bereikt.<\/p>\n<h2>Voorbeeld<\/h2>\n<p>Stel dat we de geheime boodschap<\/p>\n<p><code>JOIN ME AT EIGHT BY THE ZOO<\/code><\/p>\n<p>willen coderen door middel van de verschuivingswaarde <em>S<\/em>=2. De encryptieregel zegt dat elke letter zal worden vervangen door degene die twee posities verder in het alfabet voor komt. Bijvoorbeeld, omdat het alfabet is ABCDEFGHI<strong>J<\/strong>K<strong>L<\/strong>..., zal de eerste letter <code>J<\/code> vervangen worden door de letter <code>L<\/code>. Verder zal de <code>O<\/code> vervangen worden door <code>Q<\/code>, de <code>I<\/code> door <code>K<\/code>, enz. Om de letter te coderen, dienen we terug te gaan naar het begin: na de Y komt de Z, dan de A, dus <code>Y<\/code>wordt vervangen door <code>A<\/code>. Evenzo wordt de <code>Z<\/code> vervangen door de <code>B<\/code>. De gecodeerde versie van onze geheime boodschap wordt aldus:<\/p>\n<p><code>LQKP OG CV GKIJV DA VJG BQQ<\/code><\/p>\n<p>Wanneer de een of andere spion deze boodschap ziet, zal hij niet onmiddellijk begrijpen waar het over gaat.<\/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> Wat is het resultaat van het versleutelen van <code> SPY CODER <\/code> met de verschuivingswaarde <em> S <\/em> = 5? (Gebruik hoofdletters.) Wanneer je wilt, kun je een programma schrijven in de <a href=\"\/console\/\"> console <\/a> om dit uit rekenen. Het kan later van pas komen.<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>Coderen<\/h2>\n<p>Wanneer je vrienden de boodschap hebben gekregen en zij het geheime verschuivingsgetal <em>S<\/em> kennen, is het voor hen gemakkelijk om de boodschap te ontcijferen: elke letter moet worden vervangen door degene die <em>S<\/em> plaatsen <em>eerder<\/em> in het alfabet voor komt. Bijvoorbeeld, wanneer <code>L<\/code> moet worden gedecodeerd, ga je twee stappen terug in het alfanet en je vindt <code>J<\/code>, waarvan ze dan weten dat dat de eerste letter is van de geheime boodschap. Opnieuw moeten ze het alfabet zien als een cirkel, waarbij de <code>Z<\/code> voor de <code>A<\/code> komt.<\/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>Wanneer de gecodeerde boodschap <code>HUD<\/code> is, en de verschuivingswaarde <em>S<\/em>=6, wat is dan de origineel boodschap? (Gebruik hoofdletters.)<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>Voor de Bad Guys werken<\/h2>\n<p>Je bent ingehuurd door een spion om te helpen bij het ontcijferen van een gecodeerde boodschap waarbij een verschuivingswaarde is gebruikt. Jammer genoeg weet de spion de waarde van <em>S<\/em> niet. Je gaat statistisch onderzoek gebruiken om een programma te schrijven dat een goede kans geeft de juiste waarde van <em>S<\/em> op te sporen.<\/p>\n<p>Bij onze methode maken we gebruik van <strong>letter frequentie analyse<\/strong>. In het Engels komen sommige letters (zoals de E) vaak voor en sommige heel weinig (zoals de J). Hier volgt een frequentietabel, gebaseerd op het tellen van letters in een grote hoeveelheid tekst.<\/p>\n<table>\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>Zo is, bijvoorbeeld, de frequentie van L .0402=4.02%, en dat betekent dat in een doorsnee engelse tekst 4.02% van de letters L zijn.<\/p>\n<p>Noem de <strong>juist-waarde<\/strong> van een letter de waarde ervan in de tabel hierboven. Definieer dan in onze statistische methode de <strong>juist-waarde<\/strong> van een zin als de som van de juist-waarde van elk van de letters. Zo is bijvoorbeeld de juist-waarde van de string <code>GOOD<\/code><\/p>\n<p>juist-waarde(\"<code>GOOD<\/code>\") = .0202 + .0751 + .0751 + .0425 = .2129<\/p>\n<p>Nu is het idee van frequentie analyse dat strings met een hogere juist-waarde waarschijnlijker een engelse tekst weergeven. Wanneer bijvoorbeeld, de spion de gecodeerde boodschap \"<code>JRRG<\/code>\" ziet, dan is het zowel mogelijk dat de originele tekst \"<code>GOOD<\/code>\" is met verschuivingswaarde\u00a0<em>S<\/em>=3, als \"<code>IQQF<\/code>\" met <em>S<\/em>=1. Maar de juist-waarde van \"<code>IQQF<\/code>\" is<\/p>\n<p>juist-waarde(\"<code>IQQF<\/code>\") = .0697 + .0009 + .0009 + .0223 = .0938<\/p>\n<p>en omdat .0938 &lt; .2129, dient je programma de conclusie te trekken dat het meer waarschijnlijk is dat <code>GOOD<\/code> de juiste boodschap is dan <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> Strings meten met behulp van zijn <em>juist-waarde<\/em> is niet perfect. Stel dat de geheime boodschap\u00a0<code>JAZZ<\/code> was en de geheime verschuivingswaarde\u00a0<em>S<\/em>=10, zodat de gecodeerde tekst <code>TKJJ<\/code> was. Wanneer je <code>TKJJ<\/code> in je programma invoert dan zal ook <em>S<\/em>=10 aan bod komen, met <code>JAZZ<\/code> als een mogelijkheid met juist-zijn van .0846, maar de beste is <em>S<\/em>=5, waarbij hoort\u00a0<code>OFEE<\/code>\u00a0met een juist-zijn van .3514 als de beste gok voor de geheime boodschap. Je programma geeft dus het niet engelse woord <code>OFEE<\/code>. <\/br>(Frequentie analyse van dit type werkt beter naarmate de geheime boodschap langer is.) <\/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>Schrijf een programma met de volgende specificaties. Eerst moet het \u00e9\u00e9n regel tekst, de gecodeerde boodschap, invoeren. Deze bestaat uit hoofdletters en spaties. Je programma moet proberen de boodschap te decoderen door alle mogelijke 26 waarden van de verschuiving <em>S<\/em> toe te passen. Uit deze 26 mogelijkheden moet je degene printen met de hoogste juist-waarde.<\/div>\n<p> Om het je gemakkelijker te maken zullen we de variabele <code>letterGoodness<\/code> voor je definieren. Het is een lijst van lengte 26 met daarin de waarden van de frequentietabel hierboven, <\/p>\n<pre>letterGoodness = [.0817,.0149,.0278,.0425,.1270,.0223,.0202,...<\/pre> <\/p>\n<div><a class=\"hintlink\"  id=\"hintlink3\">Klik hier voor wat algene adviezen.<\/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> De oplossing hierboven wordt een <em>brute force<\/em> oplossing genoemd omdat je alle 26 mogelijkheden probeert. Je kunt het ook handmatig oplossen wanneer je dat zou willen. Aan de andere kant zijn moderne cryptographische protocollen, zo ontworpen dat bruce force solutions falen, zelfs als je zeer snelle computers gebruikt om alle mogelijkheden uit te proberen. <\/span><\/td><\/table><\/p>\n<p>Wanneer je wilt kun je dit decodeer systeem preciezer maken. Je kunt aandacht besteden aan andere engelstalige statistische gegevens, zoals \"welke letters komen in paren naast elkaar voor\" of \"welke letters komen het vaakst bij het begin van een woord voor\". Dit is ook nuttig voor meer algemene <a href=\"http:\/\/en.wikipedia.org\/wiki\/Substitution_cipher\">substitution ciphers<\/a>, waar letters andere letters vervangen, maar niet op een cyclische manier. Voor zulke systemen werkt brute force niet, omdat er 26*25*...*1\u00a0mogelijke substitution ciphers zijn, wat neer komt op ongeveer 4 * 10<sup>26<\/sup> (veertig quadriljard).<\/p>\n<p>Deze les is klaar! Als je wilt kun je je vrienden een gecodeerde boodschap sturen om dat te vieren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oefeningen 15A, 15B, en 15C kunnen in een willekeurige volgorde worden gemaakt. Cryptografie is de kunst en de wetenschap van het verbergen van de betekenis van informatie, zodat alleen sommige mensen die informatie krijgen. In deze les zullen we \u00e9\u00e9n &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/15c-nl\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6173","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6173","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=6173"}],"version-history":[{"count":20,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6173\/revisions"}],"predecessor-version":[{"id":8803,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6173\/revisions\/8803"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=6173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}