De Vigenèrecodering is in de cryptografie één van de klassieke methoden om tekst te versleutelen. De methode werd oorspronkelijk beschreven door Giovanni Batista Bellaso in zijn boek La cifra del Sig uit 1553, maar raakte pas in de 19e eeuw algemeen bekend door Blaise de Vigenère, waardoor het zijn naam kreeg.

Om een tekst te versleuten kiest men eerst een geheim sleutelwoord, bijvoorbeeld ZODIAK. Het sleutelwoord mag enkel bestaan uit hoofdletters (geen spaties), en wordt herhaald totdat een string verkregen wordt met dezelfde lengte als de oorspronkelijke tekst die moet gecodeerd worden (de herhaling wordt hiertoe achteraan afgebroken). Dit herhaalde sleutelwoord schrijft men dan onder de oorspronkelijke tekst.

     originele tekst : DIT IS EXTREEM GEHEIM!
                       ++++++++++++++++++++++
        sleutelwoord : ZODIAKZODIAKZODIAKZODI
                       ======================
  versleutelde tekst : CWW IC SABRODA OERDWP!

Vervolgens telt men de corresponderende letters uit de originele tekst en het sleutelwoord bij elkaar op. Bij deze optelling worden de letters A tot Z beschouwd als de getallen 0 tot 25. De optelling wordt uitgevoerd modulo 26 (het aantal letters in het alfabet). De Vigenèrecodering kan dus worden geschreven als \[V_i = (O_i + S_i)\ \mathrm{mod}\ 26\,,\] waarbij $$V_i$$ de $$i$$-de letter uit de versleutelde tekst voorstelt, $$O_i$$ de $$i$$-de letter uit de originele tekst en $$S_i$$ de $$i$$-de letter uit het sleutelwoord. Voor de eerste letter uit het bovenstaande voorbeeld krijgen we dus \[\mathrm{D} + \mathrm{Z} = (3 + 25)\ \mathrm{mod}\ 26 = 2 = \mathrm{C}\,.\]

Om te ontcijferen gebruikt men een gelijkaardige procedure, waarbij een letter van het sleutelwoord van de corresponderende letter uit het gecodeerde bericht wordt afgetrokken. De Vigenèrecodering kan dus worden geschreven als \[O_i = (V_i - S_i)\ \mathrm{mod}\ 26\,.\]

Opgave

Voorbeeld

>>> codeer('NOBODY EXPECTS THE SPANISH INQUISITION!', 'CIRCUS')
'PWSQXQ MORYUVA VBW AGCHAUP KHIWQJKNAQV!'

>>> decodeer('PWSQXQ MORYUVA VBW AGCHAUP KHIWQJKNAQV!', 'CIRCUS')
'NOBODY EXPECTS THE SPANISH INQUISITION!'

>>> codeer('OH SHUT UP! AND GO AND CHANGE YOUR ARMOUR!', 'ARTHUR')
'OY ZBLT NW! AEW AF RGK THRGNY YFNY RRDHBL!'

>>> decodeer('OY ZBLT NW! AEW AF RGK THRGNY YFNY RRDHBL!', 'ARTHUR')
'OH SHUT UP! AND GO AND CHANGE YOUR ARMOUR!'