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:

1. 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.

2. 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.

3. Í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.

4. 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:

5. 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.

6. 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.

Letöltés: cardano.txt    titkos.txt    nyilt.txt

 

Minta

3. feladat
101010
111101
110111
101101
111110
111011

 

101010
111101
110111
101101
111110
111011

 

4. feladat
KOZEPISKOLAIMATEMATIKAILAPOKINFROVAT

 

5. feladat
A kódolandó szöveg: MINDENKÉSZENÁLLAZÖNTRIESZTBŐLÉRKEZŐLEGELSŐJELÉRE…
Megfordítása: MHAZRXTRÉÉGÉSNELTEGGÜFGÁZSRORAYGAMLEFKENLEKKEGEMÖTYGAN…

 

6. feladat
A fálj elkészült.

 

sandormatyas.txt:

RHGAAZ
ÜYGGRÉ
AFXSGM
NTLÁRE
EZLFTÉ
SERÉOG

 

LKAEEN
NJEŐLM
SNEÖOL
TKEZKY
GAGEAE
ENRGÉL

 

SLÖŐÉZ
ZKBNET
EAKZLD
SRNLÉE
IÁIMRL
NTEŐZN

 

 

Megoldás

fajl = open('cardano.txt')
forras = fajl.read().splitlines()
fajl.close()

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

print('3. feladat')
kiir(forras)
print()
kiir(Forgat(forras))

print('\n4. feladat')
fajl = open('titkos.txt')
forras1 = fajl.read().splitlines()
fajl.close()
megfejtes = megfejt(forras,forras1)
for i1 in range(3):
     forras = Forgat(forras)
     megfejtes += megfejt(forras,forras1)
print(megfejtes)
forras = Forgat(forras) # hogy megkapjuk az eredeti rácsot

print('\n5. feladat\nA kódolandó szöveg:')
fajl = open('nyilt.txt')
forras2 = fajl.read()
fajl.close()
print(forras2)
forras2_megford = ''.join([forras2[i1] for i1 in range(len(forras2)-1,-1,-1)])
print('Megfordítása:')
print(forras2_megford)

print('\n6. feladat\nA fájl elkészült.')
fajl = open('sandormatyas.txt','w')
for i1 in range(len(forras2_megford)//36): # egy négyzetbe 36 betű kerülhet
     szoveg = forras2_megford[i1*36:i1*36+36]
     print(kodol(forras,szoveg),file=fajl)
fajl.close()

News Reporter