Momenteel ben ik bezig met het 'oplossen' van een aantal crypto puzzels. Eén daarvan is een simpel lineair algoritme. Stel we nemen het woord 'hallo'. Van elk karakter nemen we de ascii waarde
h = 104
a = 97
l = 108
l = 108
o = 111
En we verzinnen een numerieke key...stel key = 555
Nu gaan we het woord hallo versleutelen als volgt:
ciphertext = (ciphertext + asciiwaarde_van_letter_i ) * key
De ciphertext wordt dus een erg groot getal (bij grote keys). In dit geval wordt het:
ciphertext = ((((((((104*555)+97)*555)+108)*555)+108)*555)+111)*555 = 5485660802282430
Met dit gegeven kun je de originele letters weer terugvinden
als je de key hebt. De grap in die puzzels is dat die key onbekend is, en die moet je dus eerst zien te vinden. Nu zijn er 3 puzzels, met toenemende grootte van de key. Eén manier om te key te vinden is door het 'brute forcen'. Echter er schijnen twee andere manieren te zijn die zelfs een groot cipertext getal kunnen decrypten in een paar minuten. Dit schijnt te kunnen door goed naar het algoritme te kijken en gebruik te maken van wiskundige kennis.
Nou wiskundig is het gewoon iets van:
ciphertext = (ciphertext + c[i] ) * key , waarbij c[i] het i-de karakter is uit de plaintext c.
Je weet alleen de uiteindelijke ciphertext...en verder niets...
Hoe is dit op te lossen? Iemand een idee?