Informatika alapjai-3 Kódolás
1/9
Kódolás A hétköznapi életben a mennyiségek kétféleképpen jelennek meg: • Analóg érték: folyamatosan változó, például pillanatnyi idı, egy test tömege. A valóságot leíró jellemzık nagyobbrészt ilyenek. Például a terem hımérséklete, egy ember magassága, súlya (a fizika szerint csak közelítéssel, pl. egy testben lévı atomok száma ~ 1023 atom, de csak egész szám lehet, tehát a tömeg is kvantumosan változik). • Diszkrét érték: véges sok értéket megengedı. Például a teremben ülı hallgatók száma. A mennyiségek megjelenítése is analóg vagy digitális lehet. Például autó km órája, fordulatszám mérıje legtöbbször analóg, a megtett km mutató digitális. A digitális technika a folyamatos mennyiségeket is diszkrét értékké – számmá – alakítja, és a továbbiakban ezzel operál. Megjegyezzük, hogy a digitális jelfeldolgozás eredménye, amelyik szükségszerően diszkrét, látszhat diszkrétnek vagy folyamatosnak. Például feltőnıen diszkrét állapotai vannak egy közlekedési jelzılámpának, és folyamatosnak látszik egy digitális TV csatornán vett kép. A kódolás általánosságban azzal foglalkozik, hogy a jelenségeket hogyan lehet digitálisan leírni, és egy kódot miért és hogyan kell egy másik kóddá átalakítani. Mindkét eljárást kódolásnak (az utóbbit néha átkódolásnak) nevezik. Szőkebb értelemben a kódolás azzal foglalkozik, hogy adott a diszkrét kódolandó halmaz, a forrás, amely akár egy kódhalmaz is lehet, ennek elemeihez kell kódot rendelni. Kódolási eljárások a mindennapi életben: Mennyiségek leírása számmal Ha analóg értékrıl van szó, azt digitalizáljuk, ami egyszerre analóg-digitális átalakítás és kódolás. Például mérıszalaggal megmérünk egy hosszt, és mm pontossággal leolvassuk. A mérıszám a kód. A beszéd szövegét leírjuk Ez sokkal bonyolultabb kódolási eljárás, mint amilyennek elsıre látszik. A kód elemei a betők és írásjelek, de mik a forrás elemei? Magyar nyelvben alapvetıen a hangok és a szóköz, kivéve a részleges hasonulást (angolul inkább a szavak), de a mondatszerkezetet, amit szintén kódolunk az írásban, egyrészt a szavak hangsúlyozása, másrészt a szavak egymáshoz való viszonya szabja meg. Például: „Péter eszik, mert éhes.” “Mitıl van benne vesszı és pont?” A második idézıjeles mondatban miért nincs vesszı, és miért van kérdıjel? Megjegyzem, hogy élıbeszédben gyakran nincs szóköz, azt is ki kell találni! Piktogramok alkalmazása Stb., stb.
Informatika alapjai-3 Kódolás
2/9
1. Kódoláselméleti alapfogalmak
Példa A forrás elemek a számok, a kódbetők: +, -, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 és a tizedesvesszı, egy kódszó pedig egy szám decimálisan megadva. Másik példa A forráselemek az ABC betői és az írásjelek, a kódbetők 0 és 1 (a kód bináris), a kód a 8 bites u.n. ASCII kód 852 kódlapja (ebben vannak benne a magyar ékezetes betők): Forrás Kód Decimális Hexa A 0100 0001 65 41h B 0100 0010 66 42h ... a 1100 0001 97 61h b 1100 0010 94 62h ... Á 1100 0001 193 0C1h á 1110 0001 225 0E1h Ha az „Ábel” szót akarjuk beírni a számítógép memóriájába, akkor a következı byte sorozatot kell beírni: 0C1h,62h,65h,6Ch,0 (a végén lévı 0 jelzi a szöveg végét). Természetesen a hexadecimális számjegyek helyett az azoknak megfelelı bináris sorozatot, pl. C1 helyett 1100 0001-et. Látszik, hogy bető sorozatot kód sorozattá konvertáltunk, azaz forrás üzenetet kódolt üzenetté alakítottunk. (Forrás üzenet: a forrás elemek sorozata. Kódolt üzenet: a forrás üzenet elemenként kódolva). A továbbiakban csak bináris kódokkal foglalkozunk. A kódolás célja • Elsısorban az, hogy az információt az informatikai gép számára befogadhatóvá tegyük. Például a számokat binárisra alakítjuk, vagy a szöveget kódoljuk (ld. elıbb), vagy egy képet mintavételezünk, és pontonként kódoljuk. • Az információt minél rövidebben akarjuk ábrázolni. Ez általában az 1. lépést követi, és ilyenkor tömörítésnek nevezik.
Informatika alapjai-3 Kódolás
3/9
•
Az információt zajos csatornán torzulás nélkül akarjuk átvinni. Ekkor hibajelzı vagy hibajavító kódolást alkalmazunk • Titkosítás. Elemi kódolási módszerek • A forráshalmaz elemeit sorba rakjuk, megszámozzuk, és a sorszámot kódoljuk. Ilyen az ACII kód. • A forráshalmaz elemei mennyiségek vagy mennyiség tömbök, és a mennyiségeket kódoljuk. Ilyen a kép leírásra használt BMP formátum, melyben minden képpontot egy vagy több számmal adunk meg.
Kódolt üzenet hosszának minimalizálása A forráshalmaz elemei különbözı valószínőséggel fordulhatnak elı. Célszerő, ha a gyakran elıforduló elemekhez rendelt kód hossza kisebb, mint a ritkán elıfordulóké. A pontos kritérium a következı: a kód optimális, ha a forrás elemek kódjának hossza ni = − log c pi (feltéve, hogy a forrás elemek teljes halmazt alkotnak) pi az i. elem elıfordulásának valószínüsége, c a kód ABC-ben lévı elemek száma. Az optimum csak közelíthetı, mert a kódhossz csak egész szám lehet. Bináris esetben a kód ABC = (0, 1) ni = − log 2 pi Például: Elem Elıfordulási kódhossz = − log 2 pi valószínőség(pi) A 0,5 1 B 0,25 2 C 0,25 2 A képlet alkalmazása változó hosszúságú kódolást eredményez, melynél felmerül az üzenet megfejthetıségének kérdése: a vett üzenetben szét kell tudni választani a kódszavakat. (Ha a kódszavak hossza egyforma, akkor a kódolt üzenet biztosan megfejthetı.) Az u.n. prefix kódolás – melynél egyik kód sem a másik folytatása – megfejthetı (más eljárások is léteznek). Az u.n. prefix kódolás – melynél egyik kód sem a másik folytatása – megfejthetı (más eljárások is léteznek). pl: az {a:01, b:001, c:100, d:1100} kód prefix, mert egyik kód sem folytatása a másiknak. Az „abcc” üzenet kódja: 01001100100. Balról olvasva 01 az „a” kódja, más kód nem kezdıdik így, ezután 001 „b” kódja, 100 „c” kódja, végül 100 „c” kódja. A következı kód nem prefix, és nem megfejthetı {a: 00, b:01, c:11, d:0001}, nem prefix, mert „d” kódja folytatása „a” kódjának. Az abd kódolásával adódó 00010001 üzenet abd, dab, abab és dd üzenetként is értelmezhetı.
Informatika alapjai-3 Kódolás
4/9
Huffman kódolás Minimális átlagos hosszúságú prefix kódot eredményezı eljárás A kódolás algoritmust a következı példán mutatjuk be: Adott az alábbi kód és elıfordulási valószínőségek: Elem Valószínüség a1 0.2 a2 0.09 a3 0.19 a4 0.12 a5 0.11 a6 0.09 a7 0.2 ∑ pi = 1 teljesül. a. Vegyük a két legkisebb valószínőségő elemet, és különböztessük meg ıket egy bittel, s utána vonjuk ıket össze egyetlen olyan elemm;, melyek valószínősége a két elem valószínőségének összege. b. Ezután az összevont elemmel helyettesítve azokat, amelyek összevonásából keletkezett, folytassuk az elızı pont szerint, amíg lehetséges. A gyakorlati megvalósításhoz rendezzük az elemeket elıfordulási valószínőségük szerint, és vonjuk össze a két utolsót. Ezt ismételjük addig, amíg lehet: Rendezés Összevonás Rendezés Összevonás Rendezés Összevonás Rendezés Összevonás Rendezés Összevonás Rendezés Összevonás
a1:0,2 a7:0,2 a3:0,19 a4:0,12 a5:0,11 a2:0,09 a6:0,09 a1:0,2 a7:0,2 a3:0,19 a4:0,12 a5:0,11 a26:0,18 a1:0,2 a7:0,2 a3:0,19 a26:0,18 a4:0,12 a5:0,11 a45:0,23 a1:0,2 a7:0,2 a3:0,19 a26:0,18 a45:0,23 a1:0,2 a7:0,2 a3:0,19 a26:0,18 a45:0,23 a1:0,2 a7:0,2 a236:0,37 a236:0,37 a45:0,23 a1:0,2 a7:0,2 a236:0,37 a45:0,23 a17:0,4 a17:0,4 a236:0,37 a45:0,23 a17:0,4 a23456:0,6 a23456:0,6 a17:0,4 a1234567:1
- az utolsó két sort csak a rend kedvéért írtuk oda, az magától értetıdı. Rajzoljunk egy gráfot, amelyik az összevonásokat ábrázolja, és az összevonásoknál a két élet jelöljük 0-val és 1-gyel:
Informatika alapjai-3 Kódolás
5/9
Az egyes események kódolása a kiadódó fa gyökerétıl kiindulva egy-egy levélig (kódolandó karakterek) található 0-kat ill. 1-eket egymásután írva adódik: a1 0.2 00 a2 0.09 1010 a3 0.19 100 a4 0.12 110 a5 0.11 111 a6 0.09 1011 a7 0.2 01 Az elıfordulási valószínőséggel súlyozott átlagos kódhossz 2,38 (állandó kódhossznál 3 lenne). Megjegyezzük, hogy a gráf a táblázat létrehozása nélkül is megrajzolható. A változó hosszúságú kódolás felhasználására példa lehet a file tömörítés. A file-ban levı karakterekrıl statisztikát készítve megállapítható a karakterek elıfordulási valószínősége. Ez alapján pedig elvégezhetı a tömörítés. A tömörítéssel külön elıadásban foglalkozunk.
Információ átvitel zajos csatornán Analóg jelátvitelnél a csatorna zaja szükségszerően hozzáadódik a jelhez, és rontja a minıséget. Digitális jelátvitelnél zajos csatorna esetén is elérhetı, hogy a vételi oldalon tetszıleges elıírt valószínőséggel visszakapjuk a hibamentes adott információt! A bináris szimmetrikus emlékezet nélküli zajos csatorna modellje: p - a helyes átvitel valószínősége p (p>0.5, ha ez nem teljesül akkor a 0 0 csatorna invertál...) - a hibás átvitel valószínősége 1-p 1-p Ebben a hibamodellben un. átállítódásos hibák szerepelnek, vagyis 1 1 hiba esetén az információs bit negáltját érzékeli a vevı logika. p Azt is feltételezzük, hogy a csatorna emlékezet nélküli és idı invariáns, azaz az üzenet bármelyik bitjén ugyanakkora a tévesztés valószínősége, és a nem függ a korábbi tévesztésektıl. (Megjegyezzük, hogy a fenti modell nem minden alkalmazásban érvényes, távközlésben nagy jelentısége van az aszimmetrikus és/vagy emlékezettel rendelkezı csatornának is.)
Informatika alapjai-3 Kódolás
6/9
A továbbiakban csak fix hosszúságú bináris kódolással foglalkozunk. Egy N bites üzenetben n bites hiba elıfordulásának valószínősége: N pn = (1 − p ) n . p ( N −n ) . n A képlet azon alapszik, hogy független események együttes elıfordulásának valószínősége a valószínőségek szorzata, egymást kizáró események elıfordulásának valószínősége a valószínőségek összege. Az az esemény, hogy N bites üzeneben n hiba van, azt jelenti, hogy n N bit hibás, N-n bit hibátlan. Ez -féleképpen fordulhat elı. n 9 9*8* 7 Például = = 84 . 9 elembıl 3 elemet 84 féleképpen lehet kiválasztani 3 1* 2 * 3 ha 1−p << 1, akkor pn ≈ 1 N pn ≅ (1 − p ) n . n
Hibajelzés/javítás A hibajelzés/javítás alapja az, hogy az átvitelre alkalmazott kódszavak közötti minimális Hamming távolság (a kód Hamming távolsága) elıírt érték. Hamming távolság: két kódszóban lévı eltérı bitek száma. Például
A Hamming távolság H = 4. A vétel oldalon tévesztést az okoz, ha egyik adott kód helyett egy másik, a kódkészletben lévı kódot veszünk. Ahhoz, hogy a fenti példában A helyett B-t vegyünk, négy bithibának kell elıfordulnia. A helyzetet a következı ábra szemlélteti:
(E1 azon kódszavak halmaza, melyek Hamming távolsága A-tól 1, B-tıl 3; E2 azoké, melyek Hamming távolsága A-tól és B-tıl is 2; E3 azoké, melyek Hamming távolsága B-tıl 1, A-tól 3.) Egy bithiba esetén arra a kódra javíthatunk, melyhez jobban „hasonlít” a vett kód, pontosabban, amelyiktıl kisebb a Hamming távolsága. Két hiba esetén nem tudunk dönteni, de észleljük a hibát. A leírt módszer egy hibát javít, két hibát jelez. Másképpen is eljárhatunk: E1, E2 vagy E3 elıfordulásakor is azt mondjuk, hogy a vett kódszó hibás, és például újra kell küldeni az üzenetet. Ez a módszer legfeljebb 3 hibát jelez. Általánosságban ahhoz, hogy C hibát javító és D hibát jelzı kódot konstruáljunk (D >= C, a szükséges minimális Hamming távolság) H = 2 * C + (D – C) + 1 = C + D + 1 (A helyes értelmezéshez fontos: C hibát javító kód legalább C hibát jelez is! Például 3 hibát javító kód minimális Hamming távolsága H = 2*3 + (3−3) + 1 = 7)
Informatika alapjai-3 Kódolás
7/9
Példák hibajelzı és javító kódokra Paritás A megengedett kódszavakban páratlan számú 1-nek kell lennie (a kódok súlya páratlan [súly=a kódban lévı egyesek száma]). Az egy hibás kódszavakban biztosan páros számú 1 van, tehát felismerhetık. A konstruáláshoz egy plusz bitet kell adni a kódhoz – ez a paritásbit. Ennek értékét úgy kell beállítani, hogy a kód súlya páratlan legyen. Például: Kódszó Súly Paritás Paritásos kód 01101100 4 1 011011001 11011100 5 0 110111000 Tételezzük fel, hogy a kódszavak 8 bitesek, és egy bit helyes átvitelének valószínősége p = 99% = 0,99. A paritás nélküli kódszó hibátlan átvitelének valószínősége 0,998 = 0,92 = 92%, a hibás vétel valószínősége 8%. Ha paritásbitet alkalmazunk, a 8 bit helyett 9 bitet kell átvinni, és 1, 3, 5, 7 vagy 9 hibát tudunk jelezni. Tételezzük fel, hogy az 3, 5, 7, 9 hiba elıfordulásának valószínősége sokkal kisebb, mint az 1 hibáé és 2 hibáé (ezt tulajdonképpen meg kellene vizsgálni). Ekkor a jelzett hibák kereken az egyszeres, a nem jelzett hibák a kétszeres hibák, mert a 3, 4, 5, 6, 7, 8, 9 hiba valószínősége ezeknél sokkal kisebb: 9 p1 ≅ (1 − p ). = 0,01* 9 = 0,09 1 9 p2 ≅ (1 − p ) 2 . = 0,012 * (9 * 8 / 2) = 0,0036 2 Azaz 8% helyett csak 0,36% valószínőséggel fordul elı, hogy jelzetlen hiba van a vételi oldalon. A javulás még látványosabb, ha a csatorna jobb minıségő, azaz 1-p sokkal kisebb (egyszerően be kell helyettesíteni a képletbe, és kipróbálni). Kérdés, hogy mi történjék, ha paritáshibás a vett kód? Nem tudjuk megmondani, hogy melyik bit változott meg, ezért két lehetıség van: - újra kell küldeni az üzenetet. Ehhez kétirányú kapcsolatot kell kialakítani! - eldobni a hibás üzenetet. Ha az üzenet nélkül nem biztonságos a további mőködés, azt le kell állítani. Például, ha a PC memóriája paritáshibát jelez, a gépet újra kell indítani, és adatok – például egy megszerkesztett szöveg – veszhetnek el. Végül megjegyezzük, hogy a páros paritású kód – melyben minden kódszó súlya páros, ugyanúgy viselkedik, mint a páratlan paritású. Egy hibát jelzı 7 bites (4 bit hasznos információt tartalmazó), úgynevezett Hamming kód A következı 7 bites kódban az elsı 4 bit hordozza az információt, a maradék 3 azt eredményezi, hogy bármelyik 2 kódszó között a Hamming távolság legalább 3, azaz a kód 1 hiba javítására alkalmazható: 0000 000 0001 011 0010 101 0011 110
0100 110 0101 101 0110 011 0111 000
1000 111 1001 100 1010 010 1011 001
1100 001 1101 010 1110 111 1111 100
Informatika alapjai-3 Kódolás
8/9
Például két, a táblázatból vett kód Hamming távolsága: Kód1 0100 110 Kód2 0101 101 Különbség 0001 011 (Megjegyezzük, hogy a fenti kódban a kiegészítı biteket szisztematikusan hoztuk létre). Kiegészített Hamming kód Az elızı kódhoz tegyünk hozzá egy páratlan paritásbitet. Ekkor a kódszavak minimális távolsága 4 lesz (ez nem magától értetıdı, de ellenırizhetı!): 0000 0001 0100 1100 1000 1111 1100 0010 0001 0110 0101 1011 1001 1000 1101 0101 0010 1010 0110 0111 1010 0100 1110 1111 0011 1101 0111 0000 1011 0011 1111 1000 Így a kód egy hiba javítására, két hiba jelzésére használható. Kiegészített Hamming kódot (csak nem 8, hanem 21 bitest) használnak a PC-k ECC memóriáiban. ECC: Error Correcting Code). Egy érdekes kód Gray kód Pozició (helyzet) kódolására használják. Az egymásután következı pozíciók kódja egy Hamming távolságú. Igy a pozíció érzékelık (pl. foto érzékelık) a pozíció határ átmenetnél nem adnak hibásan "távoli" pozíciót jelentı kódot, ahogy az több Haming távolságú kód estén elıfordulhatna. Egy 3 bites Gray kód (egy n bites Gray kód nem túl bonyolult algoritmussal generálható az n bites bináris kódból): 000 001 011 010 110 111 101 100 000
Az ábra a 3 bites Gray kód alkalmazását mutatja egy úgynevezett kódtárcsán. A kódtárcsán lévı csíkokat 3 érzékelı figyeli, így az elfordulást 1/8 kör felbontással lehet jelezni. Látszik, hogy az átmeneteknél mindíg csak az egyik csík változik.
A kódolás elmélet a matematika nagy fontosságú (és nagyon bonyolult) ága. Bonyolult kódolási eljárásokat alkalmaznak tömörítésre, hibavédelemre és titkosításra.
Titkosítás A titkosítás célja az, hogy csak az tudja elolvasni az üzenetet, akinek szól. Titkos az, amit nem tudunk elolvasni, például - hieroglifák - bármilyen idegen nyelv, amit nem ismerünk - számítógép belsı ábrázolásban adott kódsorozat, például: „496E666F726D6174696B6120616C61706A6169” (Informatika alapjai) A jó titkosírást a kulcs ismerete nélkül nagyon nehéz, vagy gyakorlatilag lehetetlen megfejteni. Kulcs: szótár és/vagy algoritmus, amivel az üzenet titkosítható és megfejthetı. A klasszikus titkosírásokban kétféle módszert alkalmaztak: - helyettesítés, ennek egyszerő esete a karakterkódok hexadecimális megadása.
Informatika alapjai-3 Kódolás
9/9
- áthelyezés, amikor a szöveg karaktereit átrendezik. Az áthelyezéses titkosítás klasszikus esete a perforált négyzetrács alkalmazása. Készítsünk négyzetrácsot, melyen a négyzeteket úgy perforálják, hogy a négyzetet 90 fokonként forgatva mindig más helyen legyenek a lyukak (szorgalmi feladat: hogyan lehet ilyen négyzetrácsot készíteni?):
A rácson lévı üres helyekre beírjuk az „INFORMATIKA ALAP” szöveg elsı 4 betőjét, majd 90 fokkal elforgatjuk a rácsot, és folytatjuk. Ezt négyszer lehet ismételni. A rács levétele után a jobb oldalon lévı négyzet látszik. A titkos üzenet: „IAIRMKLNAAFAPOT “. A megfejtéshez négyzetbe rendezve le kell írni a titkosított szöveget, majd a rácsot ráhelyezve és forgatva az eredeti szöveg elolvasható. A gyakorlatban sokkal nagyobb négyzetrácsot készítenek, amelyik nehezebben megfejthetı. Ehhez hasonló elven mőködött a 2. világháborúban a német tengeralattjárókon alkalmazott Enigma titkosító – abban a szöveget háromszor egymás után titkosították, azaz az átrendezett szöveget egy másik kulccsal újra átrendezték. A szövetségesek a kódot sok-sok üzenetet elemezve megfejtették. Természetesen a helyettesítés és áthelyezés kombinálható. A számítógépes világban széleskörően alkalmazzák a titkosítást. Kétféle alkalmazást különböztetnek meg: - titkos kulcsú. Ennél a titkosításra használt kulcs alkalmazható a dekódolásra is. Ha valaki hozzájut a kulcshoz, az meg tudja fejteni az üzenetet. A titkos kulcs megvan az üzenetküldınél és a vevınél is. Ha a kulcsot ellopják, vagy feltörik, az üzenet megfejthetı. - nyilvános kulcsú: a titkosításra más kulcs szolgál, mint a dekódolásra. A titkosításra szolgáló kulcs nyilvános lehet, így bárki küldhet titkos üzenetet, amit viszont csak a jogosított vevı – akinél a kulcs van – tud dekódolni. A titkos kulcs csak a vevınél van meg, az üzenetküldı(k) csak a nyilvános kulcsot kapják meg. Ha a nyilvános kulcsot ellopják, csak üzenetet küldeni tudnak, dekódolni nem.
Hivatkozások Titkosítás Titkos kulcsú titkosítás Nyilvános kulcsú titkosítás