tirsdag 10. desember 2013 Julekalender
9. desember er over, og julekalenderens mest spennende luke sålangt (i mine øyne) gir ikke lenger flere poeng. Denne gangen presenterte jeg en litt naiv krypteringsmodul skrevet i JavaScript (gist her), samt en kryptert melding, og ba folk om å forsøke å dekryptere den.
En strategi for å løse oppgaven er å forsøke alle mulige krypteringsnøkler – brute force attack. Gjennom å studere koden ser man at nøkkelen skulle bestå av 20 tall fra 0 til 2. Da kan man jo i alle fall i teorien generere alle tenkelige nøkler, kjøre dekrypteringsmetoden, og så står man igjen med oppgaven å lokalisere den korrekte meldingen. Man kan bruke det en har blitt fortalt om svaret, og luke bort alle som ikke slutter på et komma – og så søke etter ord en kan forvente at finnes i svaret, som for eksempel "jul", "nisse", etc.
Det er veldig mange krypteringsnøkler man må forsøke om man ikke tenker seg om. Men siden vi kjenner krypteringskoden kan vi gjøre noe som er mye enklere...
Vi ser at krypteringsalgoritmen kun gjør tre ting: Den inkrementerer ascii-verdien til tegnene i teksten, forskyver tegnene mot høyre, og stapper inn noen nye tegn som egentlig ikke skal være der. Det som gjør setningen vanskeligst å lese er ascii-verdi-endringen. Hva om vi kun reverserer den?! Vi vet at verdien er inkrementert et sted mellom 0 og 20 ganger. Tar jeg den krypterte teksten og kaller shiftLeft
(fra krypteringsmodulen) 20 ganger får jeg følgende output:
0: yFiWWox*xs}}ox6*tk*rkx*o|*ox*vs~ox*rs}}sqz|yzz6zW 1: xEhVVnw)wr||nw5)sj)qjw)n{)nw)ur}nw)qr||rpy{xyy5yV 2: wDgUUmv(vq{{mv4(ri(piv(mz(mv(tq|mv(pq{{qoxzwxx4xU 3: vCfTTlu'upzzlu3'qh'ohu'ly'lu'sp{lu'opzzpnwyvww3wT 4: uBeSSkt&toyykt2&pg&ngt&kx&kt&rozkt&noyyomvxuvv2vS 5: tAdRRjs%snxxjs1%of%mfs%jw%js%qnyjs%mnxxnluwtuu1uR 6: s@cQQir$rmwwir0$ne$ler$iv$ir$pmxir$lmwwmktvstt0tQ 7: r?bPPhq#qlvvhq/#md#kdq#hu#hq#olwhq#klvvljsurss/sP 8: q>aOOgp"pkuugp."lc"jcp"gt"gp"nkvgp"jkuukirtqrr.rO 9: p=`NNfo!ojttfo-!kb!ibo!fs!fo!mjufo!ijttjhqspqq-qN 10: o<_MMen nissen, ja han er en liten hissigpropp,pM 11: n;^LLdmømhrrdm+øi`øg`mødqødmøkhsdmøghrrhfoqnoo+oL 12: m:]KKcl÷lgqqcl*÷h_÷f_l÷cp÷cl÷jgrcl÷fgqqgenpmnn*nK 13: l9\JJbkökfppbk)ög^öe^köboöbköifqbköefppfdmolmm)mJ 14: k8[IIajõjeooaj(õf]õd]jõanõajõhepajõdeooeclnkll(lI 15: j7ZHH`iôidnn`i'ôe\ôc\iô`mô`iôgdo`iôcdnndbkmjkk'kH 16: i6YGG_hóhcmm_h&ód[ób[hó_ló_hófcn_hóbcmmcajlijj&jG 17: h5XFF^gògbll^g%òcZòaZgò^kò^gòebm^gòabllb`ikhii%iF 18: g4WEE]fñfakk]f$ñbYñ`Yfñ]jñ]fñdal]fñ`akka_hjghh$hE 19: f3VDD\eðe`jj\e#ðaXð_Xeð\ið\eðc`k\eð_`jj`^gifgg#gD 20: e2UCC[dïd_ii[d"ï`Wï^Wdï[hï[dïb_j[dï^_ii_]fheff"fC
Du ser at linje 10 skiller seg litt ut, ikke sant? Nå er det bare å fjerne litt støy fra begynnelsen og slutten, og du har svaret. Vanskeligere var det faktisk ikke! Det viktigste her var å lese og forstå koden.
Det var mange som var veldig nære i dag, men som hadde små feil i svaret de sendte inn; et manglende komma, nissefar i stedet for nissen, etc.
Raskest ute med riktig svar var "nykommeren" Henrik Wingerei fra BEKK Consulting, som brukte litt over 7 minutter og stakk av med 90 poeng. Av de som lå og knivet om sammenlagtledelsen var Mikael Brevik (også fra BEKK) raskest, og han har nå overtatt ledertrøyen.
Da jeg skriver dette (klokken 9 på kvelden) har 37 utviklere svart riktig på oppgaven. Det er det laveste antallet besvarelser sålangt. Jeg vet ikke om det er fordi mange syntes oppgaven var for vanskelig, fordi utviklerne i toppen begynner å få et stort forsprang, eller en helt annen grunn. Men jeg har nå i alle fall fått litt skryt for kalenderen i dag, og det er jo veldig gøy.
Tusen takk skal dere ha!!