Een gebroken dambord is een vorm van cryptografie die kan gebruikt worden om een alfabet om te zetten naar cijfers. Er zit tegelijkertijd ook een zekere vorm van datacompressie ingebakken in de methode. Hiervoor wordt gebruikgemaakt van een rooster (het gebroken dambord) dat de volgende vorm aanneemt:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
E | T | A | O | N | R | I | S | |||
2 | B | C | D | F | G | H | J | K | L | M |
6 | P | Q | _ | U | V | W | X | Y | Z | . |
Op de eerst rij staan de tien cijfers in oplopende volgorde (0-9). De tweede rij wordt doorgaans opgevuld met vaak voorkomende letters. Daarbij worden twee posities open gelaten. Deze rij wordt ook niet voorafgegaan door een label. De twee volgende rijen worden telkens gelabeld met de cijfers waaraan geen letter werd toegewezen op de tweede rij, en worden opgevuld met de overige letters van het alfabet.
De symbolen van het alfabet kunnen op een willekeurige manier in het rooster geplaatst worden. Het rooster heeft dus in totaal 30 slots, waarvan er twee niet benut worden op de tweede rij. Als we dus een alfabet gebruiken van 26 hoofdletters, dan kunnen we nog twee extra plaatsen opvullen met andere symbolen. In bovenstaand voorbeeld hebben we als aanvulling gekozen voor een punt (.) en een underscore (_).
Bij het coderen wordt een letter die op de tweede rij staat vervangen door het cijfer dat als kolomlabel gebruikt wordt. Letters op de derde en vierde rij worden vervangen door een getal van twee cijfers, waarbij het eerst cijfer het rijlabel is, en het tweede cijfer het kolomlabel. Doordat veel voorkomende letters voorkomen op de tweede rij, kan de lengte van de gecodeerde boodschap kort gehouden worden. De boodschap THE_SHAWSHANK_REDEMPTION wordt bijvoorbeeld als volgt gecodeerd op basis van het bovenstaande rooster:
T | H | E | _ | S | H | A | W | S | H | A | N | K | _ | R | E | D | E | M | P | T | I | O | N |
1 | 25 | 0 | 62 | 9 | 25 | 3 | 65 | 9 | 25 | 3 | 5 | 27 | 62 | 7 | 0 | 22 | 0 | 29 | 60 | 1 | 8 | 4 | 5 |
Decoderen gebeurt eenvoudigweg door het proces om te keren. Ondanks het feit dat de groepen zowel uit één als uit twee cijfers kunnen bestaan, verloopt het decoderen toch ondubbelzinnig omdat een groep van twee cijfers steeds begint met een cijfer dat niet aan een letter gekoppeld is op de tweede rij van het rooster (2 en 6 in bovenstaand voorbeeld). Alle andere cijfers vormen een groep van één cijfer.
Implementeer de volgende vier functies die gebruikt kunnen worden om boodschappen te coderen en decoderen volgens de methode van het gebroken dambord. Aan deze functies moeten telkens vier stringargument doorgegeven worden, waarbij de laatste drie argumenten bestaan uit tien karakters en corresponderen met de twee, derde en vierde rij van het gebruikte rooster. Het tweede stringargument bevat twee spaties, die de posities aangeven waarop geen letters staan op de tweede rij.
Een functie letter2cijfers waaraan als eerste argument een karakter moet doorgegeven worden dat voorkomt in het gegeven rooster (of met ander woorden in één van de drie overige stringargumenten). De functie moet de string bestaande uit één of twee cijfers teruggeven die correspondeert met het gegeven karakter volgens de methode van het gebroken dambord.
Een functie cijfers2letter waaraan als eerste argument een string bestaande uit één of twee cijfers moet doorgegeven worden. De functie moet het karakter uit het gegeven rooster teruggeven dat correspondeert met deze twee cijfers volgens de methode van het gebroken dambord.
Een functie codeer waaraan als eerste argument een string moet doorgegeven worden die uitsluitend bestaat uit karakters die voorkomen in het gegeven rooster. De functie moet de gecodeerde string (bestaande uit cijfers) teruggeven die bekomen wordt door toepassing van de methode van het gebroken dambord.
Een functie decodeer waaraan als eerste argument een string moet doorgegeven worden die uitsluitend bestaat uit cijfers. De functie moet de gedecodeerde string teruggeven die bekomen wordt door toepassing van de methode van het gebroken dambord.
>>> letter2cijfers('A', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'3'
>>> letter2cijfers('C', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'21'
>>> letter2cijfers('U', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'63'
>>> cijfers2letter('3', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'A'
>>> cijfers2letter('21', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'C'
>>> cijfers2letter('63', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'U'
>>> codeer('THE_SHAWSHANK_REDEMPTION', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'1250629253659253527627022029601845'
>>> decodeer('1250629253659253527627022029601845', 'ET AON RIS', 'BCDFGHJKLM', 'PQ_UVWXYZ.')
'THE_SHAWSHANK_REDEMPTION'