Fizika, matek, informatika érettségi

Home Fizika Excel Access A weboldalról

5. szint

IV. feladatsor: Titkosírás

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.) Cardano-rács
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



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()