A középkorban használt titkosítási eljárások egyike a Cardano-rács. A titkosítandó szöveget ebben az esetben négyzet alakban rendezik el, a szöveg rejtjelezése és visszafejtése pedig az erre illeszkedő, megfelelő helyeken kivágott rostély ablakain keresztül történik. A szövegből a rácsban csak a betűk szerepelnek, az írásjelek és szóközök nem. A rostély egy-egy helyzetében a látható betűket sorfolytonosan kiolvassuk, a rostély háromszori körbefordításával a négyzet minden betűje felhasználásra kerül. (A dupla betűket két karakterrel kódoljuk, például GY helyett G és Y.)
Készíts programot, amely a Cardano-ráccsal történő rejtjelezést és visszafejtést végzi el:
Olvasd be és tárold el a Cardano-rácsot tartalmazó cardano.txt állományt, amely egy 6×6-os rostélyt tartalmaz. Az átlátszó rácspontokban 0 szerepel, a nem átlátszókban 1.
Készíts eljárást Forgat néven, amely lehetővé teszi a Cardano-rács −90 fokos (vagyis az óramutató járásával egyező irányú) elforgatását.
Írasd ki a képernyőre a megadott Cardano-rácsot, valamint annak −90 fokos elforgatását. A két rács egymás alatt jelenjen meg.
A fenti mintán látható szöveget a titkos.txt fájl tartalmazza 6×6-os rácsokra bontva. Olvasd be a fájl tartalmát, fejtsd vissza azt a megadott Cardano-rács segítségével a Forgat eljárás felhasználásával, majd a megfejtést sorfolytonosan írasd ki a képernyőre.
Ha a titkosítandó szöveg "egy négyzetnél" hosszabb, akkor azt több négyzetre kell bontani. Ha nem tesz ki a szöveg utolsó része egy teljes négyzetet, akkor azt véletlenszerű karakterekkel töltik fel.
A Cardano-rács alkalmazásával találkozhatunk Jules Verne: Sándor Mátyás c. könyvében is. A könyvben szereplő titkosítandó szöveget a nyilt.txt UTF-8 kódolású állomány tartalmazza. A könyvben a titkosítást két lépésben végezték, az alábbiakban ezt kell végrehajtani:
Olvasd be a nyilt.txt fájl tartalmát, majd fordítsd meg a szöveget. A beolvasott, illetve a megfordított szöveget egyaránt írasd ki a képernyőre.
A megfordított szöveget rejtjelezd a megadott Cardano-rács alkalmazásával, és az eredményt 6×6-os rácsban – a minta szerint – írasd ki a sandormatyas.txt fájlba.
def kiir(racs): # csak kiírja a rácsot print('\n'.join(racs))
def Forgat(racs): # a rácsot elforgatja -90°-kal ujracs = [] for i1 in range(6): sor = '' for i2 in range(6): sor += racs[5-i2][i1] ujracs.append(sor) return ujracs
def megfejt(racs,mit): # megfejti a 'mit' szöveget és visszaadja sor = '' for i1 in range(6): for i2 in range(6): if racs[i1][i2] == '0': sor += mit[i1][i2] return sor
def kodol(racs,mit): # a mit a kódolandó szöveg; visszatér a kódolt ráccsal vissza = [] # ebből képezzük majd a visszaadandó stringet; betűk tömbje for i1 in range(6): # feltöltjük a visszaadandó tömböt '0' karakterekkel vissza.append(['0' for i2 in range(6)]) jelzo = 0 # hanyadik karakter következik a szövegben for i3 in range(4): # 4-szer kell elfordítani a rácsot for i1 in range(6): for i2 in range(6): # soronként vetjük össze if racs[i1][i2] == '0': vissza[i1][i2] = mit[jelzo] jelzo += 1 racs = Forgat(racs) vissza_szoveg = '' for i1 in range(6): for i2 in range(6): vissza_szoveg += vissza[i1][i2] vissza_szoveg += '\n' return vissza_szoveg