Kalenderluke 9: En hemmelig melding


mandag 9. 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.

Løsningen

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...

luke9_sveen

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.

Resultater

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.

luke9_gorman

luke9_knut

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.

luke9_lefdal

luke9_kenneth

Tusen takk skal dere ha!!


comments powered by Disqus