Eftersom deras tidigare chiffer var ett Caesar-chiffer (och för att jag hade Caesar-dressing till min sallad till lunchen) var det lika bra att prova med det först. Fast egentligen trodde jag inte att det skulle vara så lätt.
Redan från början gjorde några antaganden, som senare visade sig stämma. Lite tur, alltså. Som att klartextmeddelandet skulle vara skrivet på svenska, och att man använt hela det svenska alfabetet, fast utan siffror och skiljetecken. Ett litet program testar alla tänkbara rullningar:
Kod:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
crypto=u'ÄTVVFVWWÅTYVYBYÅZMWASVRR'
alfa=u'ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ'
for n in range(len(alfa)):
output= "%2d " % n
for c in crypto:
output+= alfa[((alfa.find(c) + n) % len(alfa))]
print(output)
print
Men det där gav ju ingenting. (Men om man tittar på utskriften så ser man hur man kan förenkla det för sig om man måste lösa ett Caesar-chiffer för hand. Man skriver kryptot på en rad och sedan skriver man alfabetet neråt med början på den bokstaven.)
Då var det alltså något mer komplicerat. Vigenère-chiffret, kanske? Men det finns ett enklare man kan pröva först. Ett rullande Caesar-chiffer. Dvs man börja med att förskjuta ett visst antal steg. Sedan ökar eller minskar man på förskjutningen efter varje bokstav.
Så jag ändrade i programmet så det skulle stega i Caesar-rullningen åt olika håll. Jag bara chansade på gränserna -10 till 10, men det visade sig att jag hade tur och det räckte.
Kod:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
crypto=u'ÄTVVFVWWÅTYVYBYÅZMWASVRR'
alfa=u'ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ'
for k in range(-10, 10):
for n in range(len(alfa)):
output="%2d %2d " % (k, n)
for c in crypto:
output+= alfa[((alfa.find(c) + n) % len(alfa))]
n+=k
print(output)
print
Nu blev det en lång utskrift, men genom att ögna igenom den hittade jag en intressant rad:
Kod:
ÅRSRAPPORJNJLQJKIXDJÅÖXW
Det där var nog ingen slump. ÅRSRAPPOR betyder säkert att jag är lösningen på spåren. Alltså en Caesar-rullning förskjuten 28 steg, som för varje bokstav minskar förskjutningen med 1.
I den dekrypterade texten är det ett J där det borde vara ett T. I den krypterade texten är det faktiskt ett T på den platsen. Är det så att rullningen börjar om på noll när den kommit ner till 20? En liten ändring i programmet så går det att testa:
Kod:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
crypto=u'ÄTVVFVWWÅTYVYBYÅZMWASVRR'
alfa= u'ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ'
k = -1
n = 28
output="%2d %2d " % (k, n)
for c in crypto:
output+= alfa[((alfa.find(c) + n) % len(alfa))]
n = (n + k, len(alfa))[n == 20]
print(output)
Och där kom klartexten! ÅRSRAPPORTXTVÅTUSENARTON
X betyder uppenbarligen mellanslag.
Nu var detta knappast ett krypto. Det var mera som ett bokstavspussel. När man nu vet algoritmen är det väldigt enkelt att knäcka det. Nyckeln består av tre tal, som kan variera mellan 0 och 28. det finns alltså bara 28³ = 21952 olika nycklar. Det tar en bråkdel av en sekund för datorn att köra igenom alla alternativen.