Sir Francis Beaufort1 was een Britse admiraal die met name bekend is geworden door de naar hem vernoemde schaal voor windkracht: de schaal van Beaufort2. Ook de Beaufortzee3 werd naar hem vernoemd.
Wellicht minder bekend is de Beaufortversleuteling: een manier die hij uitvond om berichten te coderen en te decoderen. De meest bekende toepassing ervan was een rotor-gebaseerde codeermachine uit de Tweede Wereldoorlog: de Hagelin M-2094. In die versleuteling hebben alle letters (A–Z) een waarde (0–25) die correspondeert met hun positie in het alfabet.
Om een bericht $$M = M_0\ldots M_{n-1}$$ van $$n$$ letters te coderen, gebruikt de Beaufortversleuteling een sleutel waarvan de letters desnoods herhaald of afgekapt worden om een tweede reeks $$K = K_0\ldots K_{n-1}$$ van $$n$$ letters te bekomen. De cijfertekst $$C = C_0\ldots C_{n-1}$$ (het gecodeerde bericht) van $$n$$ letters wordt bekomen door (de waarde van) de letters op overeenkomstige posities van elkaar af te trekken (modulo 26): \[ C_i = (K_i - M_i)\ \textrm{mod}\ 26 \ \ \ i = 0, \ldots, n-1\] Als we dit toepassen om het bericht DEFENDTHEEASTWALLOFTHECASTLE te coderen met sleutel FORTIFICATION, dan krijgen we
Een cijfertekst kan gedecodeerd worden door er opnieuw dezelfde codering op toe te passen. Er geldt immers dat \[ M_i = (K_i - C_i)\ \textrm{mod}\ 26 \ \ \ i = 0, \ldots, n-1\] Als we dit toepassen op het bovenstaande voorbeeld, dan krijgen we
Omdat decoderen bij een Beaufortversleuteling exact hetzelfde is als coderen, spreekt met van een symmetrische versleuteling.
Definieer een klasse Beaufort waarmee berichten kunnen gecodeerd en gedecodeerd worden volgens een Beaufortversleuteling met sleutel $$K$$. Bij het aanmaken van een nieuwe versleuteling (Beaufort) moet de sleutel $$K$$ (String) doorgegeven worden. De klasse mag ervan uitgaan dat alle berichten, sleutels en cijferteksten enkel uit hoofdletters bestaan en dat een sleutel minstens vier letters telt, zonder dat dit expliciet moet gecontroleerd worden.
Een versleuteling $$v$$ (Beaufort) moet een eigenschap sleutel hebben, met als waarde de sleutel $$K$$ (String) die werd doorgegeven bij het aanmaken van de versleuteling $$v$$.
Op een versleuteling $$v$$ (Beaufort) moet je minstens de volgende methoden kunnen aanroepen:
Een methode codeerLetter waaraan twee argumenten moeten doorgegeven worden: i) de $$i$$-de letter $$M_i$$ (String) van een bericht en ii) de positie $$i$$ (Number) van die letter binnen het bericht, waarbij posities genummerd worden vanaf 0. De methode moet de $$i$$-de letter $$C_i$$ (String) uit de corresponderende cijfertekst teruggeven.
Een methode codeer waaraan een bericht $$M$$ (String) moet doorgegeven worden. De methode moet de cijfertekst $$C$$ (String) voor bericht $$M$$ teruggeven.
Een methode decodeerLetter waaraan twee argumenten moeten doorgegeven worden: i) de $$i$$-de letter $$C_i$$ (String) van een cijfertekst en ii) de positie $$i$$ (Number) van die letter binnen de cijfertekst, waarbij posities genummerd worden vanaf 0. De methode moet de $$i$$-de letter $$M_i$$ (String) van het originele bericht teruggeven.
Een methode decodeer waaraan een cijfertekst $$C$$ (String) moet doorgegeven worden. De methode moet het originele bericht $$M$$ (String) voor cijfertekst $$C$$ teruggeven.
Definieer ook nog deze drie afzonderlijke functies:
Een functie optellen waaraan twee versleutelingen $$v_1$$ en $$v_2$$ (Beaufort) moeten doorgegeven worden. De functie moet een nieuwe versleuteling (Beaufort) teruggeven die correspondeert met de optelling van de versleutelingen $$v_1$$ en $$v_2$$.
De optelling van twee versleutelingen (Beaufort) met sleutels $$r = r_0\ldots r_{a-1}$$ en $$s = s_0\ldots s_{b-1}$$ is een versleuteling (Beaufort) met sleutel $$t^{+} = t^{+}_0\ldots t^{+}_{c-1}$$. Daarbij is $$c$$ gelijk aan het kleinste gemene veelvoud van $$a$$ en $$b$$ zodat we $$r' = r'_0\ldots r'_{c-1}$$ kunnen bepalen als $$\frac{c}{a}$$ herhalingen van $$r$$ en $$s' = s'_0\ldots s'_{c-1}$$ als $$\frac{c}{b}$$ herhalingen van $$s$$. De sleutel $$t^{+}$$ wordt dan bekomen door (de waarde van) de letters op overeenkomstige posities bij elkaar op te tellen (modulo 26): \[ t^{+}_i = (r'_i + s'_i)\ \textrm{mod}\ 26 \ \ \ i = 0, \ldots, c-1\] Als we dit toepassen op de twee sleutels SECRET en WORD dan krijgen we
Voor het kleinste gemene veelvoud $$\textrm{kgv}(a,b)$$ van twee natuurlijke getallen $$a$$ en $$b$$ geldt dat \[ \textrm{kgv}(a,b) = \frac{a \times b}{\textrm{ggd}(a, b)} \] Daarbij staat $$\textrm{ggd}(a, b)$$ voor de grootste gemene deler (ggd) van $$a$$ en $$b$$. Je kunt deze JavaScript implementatie gebruiken om de ggd te berekenen:
const ggd = (a, b) => b === 0 ? Math.abs(a) : ggd(b, a % b);
Een functie aftrekken waaraan twee versleutelingen $$v_1$$ en $$v_2$$ (Beaufort) moeten doorgegeven worden. De functie moet een nieuwe versleuteling (Beaufort) teruggeven die correspondeert met de aftrekking van de versleutelingen $$v_1$$ en $$v_2$$.
De aftrekking van twee versleutelingen (Beaufort) met sleutels $$r = r_0\ldots r_{a-1}$$ en $$s = s_0\ldots s_{b-1}$$ is een versleuteling (Beaufort) met sleutel $$t^{-} = t^{-}_0\ldots t^{-}_{c-1}$$. De sleutel $$t^{-}$$ wordt bekomen door (de waarde van) de letters op overeenkomstige posities van elkaar af te trekken (modulo 26): \[ t^{-}_i = (r'_i - s'_i)\ \textrm{mod}\ 26 \ \ \ i = 0, \ldots, c-1\] Als we dit toepassen op de twee sleutels SECRET en WORD dan krijgen we
Een functie vermenigvuldigen waaraan twee argumenten moeten doorgegeven worden: een geheel getal $$k$$ en een versleuteling $$v$$ (Beaufort). Het maakt niet uit in welke volgorde deze argumenten doorgegeven worden. De functie moet een nieuwe versleuteling (Beaufort) teruggeven die correspondeert met de vermenigvuldiging van getal $$k$$ en versleuteling $$v$$.
De vermenigvuldiging van een geheel getal $$k$$ (Number) met een versleuteling (Beaufort) met sleutel $$r = r_0\ldots r_{a-1}$$ — of omgekeerd — is een versleuteling (Beaufort) met een sleutel $$t^{*} = t^{*}_0\ldots t^{*}_{a-1}$$. De sleutel $$t^{*}$$ wordt bekomen door (de waarde van) alle letters te vermenigvuldigen met $$k$$ (modulo 26): \[ t^{*}_i = k\,r_i\ \textrm{mod}\ 26 \ \ \ i = 0, \ldots, a-1\]
> const codec = new Beaufort("FORTIFICATION")
> codec.sleutel
"FORTIFICATION"
> codec.codeerLetter("D", 0)
"C"
> codec.codeerLetter("E", 1)
"K"
> codec.codeerLetter("F", 2)
"M"
> codec.codeer("DEFENDTHEEASTWALLOFTHECASTLE")
"CKMPVCPVWPIWUJOGIUAPVWRIWUUK"
> codec.decodeerLetter("C", 0)
"D"
> codec.decodeerLetter("K", 1)
"E"
> codec.decodeerLetter("M", 2)
"F"
> codec.codeer("CKMPVCPVWPIWUJOGIUAPVWRIWUUK")
"DEFENDTHEEASTWALLOFTHECASTLE"
> const codec1 = new Beaufort("SECRET")
> const codec2 = new Beaufort("WORD")
> optellen(codec1, codec2).sleutel
"OSTUAHJHYFVW"
> aftrekken(codec1, codec2).sleutel
"WQLOIFBBGDNQ"
> vermenigvuldigen(codec1, 3).sleutel
"CMGZMF"
> vermenigvuldigen(3, codec1).sleutel
"CMGZMF"
> optellen(optellen(codec1, codec1), codec1).sleutel
"CMGZMF"
De stripverhalen van Don Martin in het tijdschrift MAD5 stonden vooral bekend omwille van hun vele geluidseffecten:
Doug Gilford heeft ze allemaal in een mooi overzicht6 gegoten.