Sir Francis Beaufort1 was een Britse admiraal die met name bekend is geworden omwille van 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 daarvan 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 sleutelwoord 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 sleutelwoord 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 een sleutelwoord $$K$$ dat moet doorgegeven worden bij het aanmaken van objecten van de klasse. De klasse mag ervan uitgaan dat alle berichten, sleutelwoorden en cijferteksten enkel uit hoofdletters bestaan en dat een sleutelwoord minstens vier letters telt, zonder dat dit niet expliciet moet gecontroleerd worden. Daarnaast moet een Beaufortversleuteling (Beaufort) minstens de volgende methoden ondersteunen:
Een methode codeer_letter waaraan twee argumenten moeten doorgegeven worden: i) de $$i$$-de letter $$M_i$$ (str) van een bericht en ii) de positie $$i$$ (int) van die letter binnen het bericht, waarbij posities genummerd worden vanaf 0. De methode moet de $$i$$-de letter $$C_i$$ uit de corresponderende cijfertekst teruggeven.
Een methode codeer waaraan een bericht $$M$$ (str) moet doorgegeven worden. De methode moet de cijfertekst $$C$$ (str) voor bericht $$M$$ teruggeven.
Een methode decodeer_letter waaraan twee argumenten moeten doorgegeven worden: i) de $$i$$-de letter $$C_i$$ (str) van een cijfertekst en ii) de positie $$i$$ (int) van die letter binnen de cijfertekst, waarbij posities genummerd worden vanaf 0. De methode moet de $$i$$-de letter $$M_i$$ van het originele bericht teruggeven.
Een methode decodeer waaraan een cijfertekst $$C$$ (str) moet doorgegeven worden. De methode moet het originele bericht $$M$$ (str) voor cijfertekst $$C$$ teruggeven.
Als er een Beaufortversleuteling (Beaufort) wordt doorgegeven aan de ingebouwde functie str dan moet diens sleutelwoord (str) teruggegeven worden waarin alle letters behalve de eerste twee en de laatste twee zijn vervangen door sterretjes (*). Analoog moet de ingebouwde functie repr een string (str) teruggeven waarvan het formaat kan afgeleid worden uit onderstaand voorbeeld.
De optelling (+) van twee Beaufortversleutelingen (Beaufort) met sleutelwoorden $$r = r_0\ldots r_{a-1}$$ en $$s = s_0\ldots s_{b-1}$$ moet een nieuwe Beaufortversleuteling (Beaufort) opleveren met sleutelwoord $$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$$. Het sleutelwoord $$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 sleutelwoorden 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 van $$a$$ en $$b$$. Die laatste kan in Python bepaald worden aan de hand van de functie gcd5 uit de math-module van The Python Standard Library6.
Analoog moet de aftrekking (-) van twee Beaufortversleutelingen (Beaufort) een nieuwe Beaufortversleuteling (Beaufort) opleveren met een sleutelwoord $$t^{-} = t^{-}_0\ldots t^{-}_{c-1}$$ dat bekomen wordt 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 sleutelwoorden SECRET en WORD dan krijgen we
De vermenigvuldiging (*) van een geheel getal $$k$$ (int) met een Beaufortversleuteling (Beaufort) met sleutelwoord $$r = r_0\ldots r_{a-1}$$ — of omgekeerd — moet een nieuwe Beaufortversleuteling (Beaufort) opleveren met een sleutelwoord $$t^{*} = t^{*}_0\ldots t^{*}_{a-1}$$ dat bekomen wordt 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\].
>>> versleuteling = Beaufort('FORTIFICATION')
>>> print(versleuteling)
FO*********ON
>>> versleuteling
Beaufort('FORTIFICATION')
>>> versleuteling.codeer_letter('D', 0)
'C'
>>> versleuteling.codeer_letter('E', 1)
'K'
>>> versleuteling.codeer_letter('F', 2)
'M'
>>> versleuteling.codeer('DEFENDTHEEASTWALLOFTHECASTLE')
'CKMPVCPVWPIWUJOGIUAPVWRIWUUK'
>>> versleuteling.decodeer_letter('C', 0)
'D'
>>> versleuteling.decodeer_letter('K', 1)
'E'
>>> versleuteling.decodeer_letter('M', 2)
'F'
>>> versleuteling.decodeer('CKMPVCPVWPIWUJOGIUAPVWRIWUUK')
'DEFENDTHEEASTWALLOFTHECASTLE'
>>> Beaufort('SECRET') + Beaufort('WORD')
Beaufort('OSTUAHJHYFVW')
>>> Beaufort('SECRET') - Beaufort('WORD')
Beaufort('WQLOIFBBGDNQ')
>>> Beaufort('SECRET') * 3
Beaufort('CMGZMF')
>>> 3 * Beaufort('SECRET')
Beaufort('CMGZMF')
>>> Beaufort('SECRET') + Beaufort('SECRET') + Beaufort('SECRET')
Beaufort('CMGZMF')
De stripverhalen van Don Martin in het tijdschrift MAD7 stonden vooral bekend omwille van hun vele geluidseffecten:
Doug Gilford heeft ze allemaal in een mooi overzicht8 gegoten.