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.

Francis BeaufortDe Hagelin M-209.

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 (AZ) een waarde (0–25) die correspondeert met hun positie in het alfabet.

alfabet
In de Beaufortversleuteling hebben alle letters (AZ) 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

codering
Codering van het bericht DEFENDTHEEASTWALLOFTHECASTLE door een Beaufortversleuteling met sleutelwoord FORTIFICATION, levert de cijfertekst CKMPVCPVWPIWUJOGIUAPVWRIWUUK op.

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

decodering
Decodering van de cijfertekst CKMPVCPVWPIWUJOGIUAPVWRIWUUK door een Beaufortversleuteling met sleutelwoord FORTIFICATION, levert terug het originele bericht DEFENDTHEEASTWALLOFTHECASTLE op.

Omdat decoderen bij een Beaufortversleuteling exact hetzelfde is als coderen, spreekt met van een symmetrische versleuteling.

Opgave

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:

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

sleutels optellen
De optelling van twee Beaufortversleutelingen (Beaufort) met sleutelwoorden $$r$$ en $$s$$ levert een nieuwe Beaufortversleuteling (Beaufort) op waarvan het sleutelwoord $$t^{+}$$ bekomen wordt als de som van de twee (uitgebreide) sleutelwoorden $$r'$$ en $$s'$$.

Kleinste gemene veelvoud

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

sleutels aftrekken
De aftrekking van twee Beaufortversleutelingen (Beaufort) met sleutelwoorden $$r$$ en $$s$$ levert een nieuwe Beaufortversleuteling (Beaufort) op waarvan het sleutelwoord $$t^{-}$$ bekomen wordt als het verschil van de twee (uitgebreide) sleutelwoorden $$r'$$ en $$s'$$.

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

Voorbeeld

>>> 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')

Epiloog: Action!

Action!

De stripverhalen van Don Martin in het tijdschrift MAD7 stonden vooral bekend omwille van hun vele geluidseffecten:

  • ARGLE GLARGLE GLORGLE GLUK: prinses die mondwater gebruikt
  • BUKKIDA BUKKIDA BAKKIDA BAKKIDA: bokser die met hoofd van tegenstander rammelt
  • CHOOK CHOOK CHOOK CHOOK: man die aan het graven is
  • DOOT: arts die met hamer op knie van patiënt slaat
  • FAGWOOSH SHOSSH GOOGLOOOM FUSH: geluiden die te horen zijn in zeeschelp
  • FLOOT THWIP THOP KLOP: man die een paraplu opvouwt
  • FOOWOOM: vlammenwerper
  • FWISK FWISK FWISKITTY FWASK: man die onbewoond eiland veegt
  • GEEEN: Plastic Man die middelvinger uitsteekt naar man op 32e verdieping
  • KITTOONG SHKLUNK: hersenen die als basketbal in hoofd van Frankenstein gegooid worden
  • KOONG: man die aan hoofd geraakt wordt door kruiwagen vol cement
  • MOWM: explosie van atoombom
  • POING POING POING: springstok
  • SHKWITZ SHKWITZ: man die bril schoonmaakt
  • SLOOPLE GLIK SPLORP: man die soep eet
  • WUNK SPWAPPO KATOONK SPLAT: passagiers die kaper aanvallen

Doug Gilford heeft ze allemaal in een mooi overzicht8 gegoten.