Het autosleutelcijfer (ook autoclavecijfer of autokeycijfer) is in de cryptografie één van de klassieke methoden om teksten te versleutelen. De versleuteling maakt gebruik van een polyalfabetische substitutie, waarbij letters worden vervangen aan de hand van verschillende alfabetische reeksen. Daarbij wordt een tabel gebruikt, waarin elk alfabet één letter verschoven is
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
B | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A |
C | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B |
D | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C |
E | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D |
F | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E |
G | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F |
H | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G |
I | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H |
J | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I |
K | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J |
L | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K |
M | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L |
N | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M |
O | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N |
P | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
Q | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P |
R | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q |
S | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R |
T | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S |
U | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T |
V | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U |
W | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V |
X | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W |
Y | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X |
Z | Z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y |
Om een tekst te versleuten verwijdert men eerst alle tekens uit de tekst die geen letters zijn. Daarna kiest men een geheim sleutelwoord dat enkel uit letters bestaat, bijvoorbeeld WATER. De tekst (waarin enkel de letters werden weerhouden) wordt achteraan het sleutelwoord toegevoegd, en daarna worden de tekst en het sleutelwoord onder elkaar geschreven.
originele tekst: MEETMEATTHEFOUNTAIN sleutelwoord: WATERMEETMEATTHEFOU ------------------- gecodeerde tekst: IEXXDQEXMTIFHNUXFWH
Vervolgens zoekt men elke letter uit de originele tekst op in het verticale alfabet en de letter op de corresponderende positie van het sleutelwoord in het horizontale alfabet. De gecodeerde letter vind men dan op de overeenkomstige positie in het rooster.
Om een gecodeerde tekst (die enkel bestaat uit letters) te kunnen ontcijferen dient men te beginnen met het oorspronkelijke sleutelwoord, dat beetje bij beetje aangevuld wordt met de reeds gedecodeerde tekst. Indien er één fout optreedt bij het decoderen, dan zal de rest van de gedecodeerde tekst ook fout zijn. Hierdoor is het extreem moeilijk om teksten die gecodeerd zijn aan de hand van een autosleutelcijfer te ontcijferen zonder dat men over de gebruikte sleutel beschikt.
Schrijf een functie substitutie waaraan twee letters als argument moeten doorgegeven worden. De functie moet de hoofdletter teruggeven die in het rooster van het autosleutelcijfer correspondeert met de positie van de eerste letter in het verticale alfabet en de positie van de tweede letter in het horizontale alfabet. Zorg ervoor dat de functie geen onderscheid maakt tussen hoofdletters en kleine letters die als argument aan de functie doorgegeven worden.
Schrijf een functie codeer die een gegeven tekst $$t$$ versleutelt volgens het autosleutelcijfer met een gegeven sleutel $$s$$ die enkel uit letters bestaat. De originele tekst $$t$$ en de sleutel $$s$$ moeten als argument aan de functie doorgegeven worden. De functie moet de versleutelde tekst als resultaat teruggegeven.
Schrijf een functie decodeer als de duale functie van de functie codeer. Deze functie moet dus een gegeven tekst $$t$$ ontcijferen volgens het autosleutelcijfer met een gegeven sleutel $$s$$ die enkel uit letters bestaat. De versleutelde tekst $$t$$ en de sleutel $$s$$ moeten als argument aan de functie doorgegeven worden. De functie moet de ontcijferde tekst als resultaat teruggegeven.
>>> substitutie('M', 'K')
'W'
>>> substitutie('e', 'I')
'M'
>>> substitutie('E', 'l')
'P'
>>> codeer('MEETMEATTHEFOUNTAIN', 'WATER')
'IEXXDQEXMTIFHNUXFWH'
>>> codeer('And now for something completely different!', 'SHRUBBERY')
'SUUHPXJFPSBPRHDNBXUCYTELBRRARUUQIKIYR'
>>> decodeer('IEXXDQEXMTIFHNUXFWH', 'WATER')
'MEETMEATTHEFOUNTAIN'
>>> decodeer('SUUHPXJFPSBPRHDNBXUCYTELBRRARUUQIKIYR', 'SHRUBBERY')
'ANDNOWFORSOMETHINGCOMPLETELYDIFFERENT'