tanszek:oktatas:szamitastechnika:binaris_muveletek
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| tanszek:oktatas:szamitastechnika:binaris_muveletek [2025/09/16 19:27] – [Gyakorlati példa: Bitek beállítása és törlése] knehez | tanszek:oktatas:szamitastechnika:binaris_muveletek [2026/09/18 18:53] (current) – [Gyakorlati példa: Bitek beállítása és törlése] knehez | ||
|---|---|---|---|
| Line 132: | Line 132: | ||
| Az igazságtáblák és a fenti példák segítségével megérthető, | Az igazságtáblák és a fenti példák segítségével megérthető, | ||
| + | |||
| + | === Az XOR fontos tulajdonságai === | ||
| + | |||
| + | Az XOR műveletnek több hasznos tulajdonsága van: | ||
| + | |||
| + | < | ||
| + | A XOR 0 = A | ||
| + | A XOR 1 = NOT A | ||
| + | A XOR A = 0 | ||
| + | (A XOR B) XOR B = A | ||
| + | </ | ||
| + | |||
| + | Ezek jelentése: | ||
| + | |||
| + | * A 0-val végzett XOR nem változtatja meg a bitet. | ||
| + | * Az 1-gyel végzett XOR megfordítja a bitet. | ||
| + | * Egy bit önmagával végzett XOR művelete mindig 0. | ||
| + | * Ha ugyanazzal az értékkel kétszer végzünk XOR műveletet, visszakapjuk az eredeti értéket. | ||
| + | |||
| + | Az utolsó tulajdonság teszi lehetővé, hogy az XOR műveletet egyszerű titkosításra is használjuk. | ||
| + | |||
| + | === Két bináris érték különbségének megkeresése === | ||
| + | |||
| + | Az XOR segítségével könnyen megállapítható, | ||
| + | |||
| + | Legyen a két érték: | ||
| + | |||
| + | < | ||
| + | 10101101 | ||
| + | ^ 10000111 | ||
| + | ---------- | ||
| + | 00101010 | ||
| + | </ | ||
| + | |||
| + | Az eredményben ott található 1-es, ahol a két eredeti érték bitjei különböznek. A fenti példában a két szám három bitpozícióban tér el egymástól. | ||
| + | |||
| + | Ez például két hardverregiszter, | ||
| + | |||
| + | === Egyszerű titkosítás XOR művelettel === | ||
| + | |||
| + | Legyen az üzenetet tartalmazó bájt: | ||
| + | |||
| + | < | ||
| + | Üzenet: 01000001 | ||
| + | Kulcs: | ||
| + | </ | ||
| + | |||
| + | Az üzenet titkosításához XOR műveletet végzünk: | ||
| + | |||
| + | < | ||
| + | 01000001 | ||
| + | ^ 00110110 | ||
| + | ---------- | ||
| + | 01110111 | ||
| + | </ | ||
| + | |||
| + | A titkosított adat visszafejtéséhez ugyanazt a kulcsot ismét alkalmazzuk: | ||
| + | |||
| + | < | ||
| + | 01110111 | ||
| + | ^ 00110110 | ||
| + | ---------- | ||
| + | 01000001 | ||
| + | </ | ||
| + | |||
| + | Ez azért működik, mert: | ||
| + | |||
| + | < | ||
| + | (Üzenet XOR Kulcs) XOR Kulcs = Üzenet | ||
| + | </ | ||
| + | |||
| + | A kulcs kétszeri alkalmazása megszünteti annak hatását, mivel: | ||
| + | |||
| + | < | ||
| + | Kulcs XOR Kulcs = 0 | ||
| + | </ | ||
| + | |||
| + | és: | ||
| + | |||
| + | < | ||
| + | Üzenet XOR 0 = Üzenet | ||
| + | </ | ||
| + | |||
| + | === Szöveg titkosítása XOR művelettel === | ||
| + | |||
| + | A számítógép a szöveg karaktereit is számokként tárolja. Például az '' | ||
| + | |||
| + | < | ||
| + | A = 65 = 01000001 | ||
| + | </ | ||
| + | |||
| + | Ha a titkosítási kulcs értéke 54: | ||
| + | |||
| + | < | ||
| + | Kulcs = 54 = 00110110 | ||
| + | </ | ||
| + | |||
| + | akkor a titkosított bájt: | ||
| + | |||
| + | < | ||
| + | 01000001 | ||
| + | ^ 00110110 | ||
| + | ---------- | ||
| + | 01110111 | ||
| + | </ | ||
| + | |||
| + | A visszafejtéskor ugyanezt a kulcsot használjuk: | ||
| + | |||
| + | < | ||
| + | 01110111 | ||
| + | ^ 00110110 | ||
| + | ---------- | ||
| + | 01000001 | ||
| + | </ | ||
| + | |||
| + | Egy programban az eljárás elvi formája: | ||
| + | |||
| + | <code c> | ||
| + | titkositott_adat = eredeti_adat ^ kulcs; | ||
| + | visszafejtett_adat = titkositott_adat ^ kulcs; | ||
| + | </ | ||
| + | |||
| + | Fontos, hogy az XOR művelet önmagában nem garantál biztonságos titkosítást. Ha rövid vagy könnyen kitalálható kulcsot használunk, | ||
| + | |||
| + | === One-time pad titkosítás === | ||
| + | |||
| + | Az XOR-ra épülő különleges titkosítási módszer a //one-time pad//, magyarul egyszer használatos kulcs. | ||
| + | |||
| + | A módszer akkor tekinthető tökéletesen biztonságosnak, | ||
| + | |||
| + | * a kulcs valóban véletlenszerű; | ||
| + | * a kulcs legalább olyan hosszú, mint az üzenet; | ||
| + | * a kulcsot titokban tartják; | ||
| + | * ugyanazt a kulcsot csak egyszer használják fel. | ||
| + | |||
| + | A titkosítás: | ||
| + | |||
| + | < | ||
| + | Titkosított üzenet = Üzenet XOR Kulcs | ||
| + | </ | ||
| + | |||
| + | A visszafejtés: | ||
| + | |||
| + | < | ||
| + | Üzenet = Titkosított üzenet XOR Kulcs | ||
| + | </ | ||
| + | |||
| + | A gyakorlatban az egyszer használatos kulcs biztonságos továbbítása és tárolása nehéz, ezért a modern titkosítási eljárások általában nem közvetlenül ezt a módszert használják. A folyamtitkosítók azonban hasonló elven működnek: egy kulcsból előállított kulcsfolyamot XOR művelettel kapcsolnak össze az üzenettel. | ||
| + | |||
| + | === Egyszerű XOR-titkosítás programban === | ||
| + | |||
| + | Az alábbi C program minden karaktert ugyanazzal a kulccsal alakít át: | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | char szoveg[] = " | ||
| + | char kulcs = 42; | ||
| + | |||
| + | for (int i = 0; szoveg[i] != ' | ||
| + | { | ||
| + | szoveg[i] = szoveg[i] ^ kulcs; | ||
| + | } | ||
| + | |||
| + | printf(" | ||
| + | |||
| + | for (int i = 0; szoveg[i] != ' | ||
| + | { | ||
| + | printf(" | ||
| + | } | ||
| + | |||
| + | for (int i = 0; szoveg[i] != ' | ||
| + | { | ||
| + | szoveg[i] = szoveg[i] ^ kulcs; | ||
| + | } | ||
| + | |||
| + | printf(" | ||
| + | |||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | A titkosított adatot hexadecimális számokként jelenítjük meg, mert az XOR művelet eredményeként nem nyomtatható karakterek is keletkezhetnek. | ||
| + | |||
| + | Ez a program csak az XOR működését szemlélteti. Valódi adatok védelmére nem biztonságos, | ||
| + | |||
| + | === Két változó értékének felcserélése XOR művelettel === | ||
| + | |||
| + | Érdekességként két egész szám értéke ideiglenes változó nélkül is felcserélhető: | ||
| + | |||
| + | <code c> | ||
| + | a = a ^ b; | ||
| + | b = a ^ b; | ||
| + | a = a ^ b; | ||
| + | </ | ||
| + | |||
| + | Például legyen: | ||
| + | |||
| + | < | ||
| + | a = 5 | ||
| + | b = 3 | ||
| + | </ | ||
| + | |||
| + | Binárisan: | ||
| + | |||
| + | < | ||
| + | a = 0101 | ||
| + | b = 0011 | ||
| + | </ | ||
| + | |||
| + | A műveletek: | ||
| + | |||
| + | < | ||
| + | a = 0101 XOR 0011 = 0110 | ||
| + | b = 0110 XOR 0011 = 0101 | ||
| + | a = 0110 XOR 0101 = 0011 | ||
| + | </ | ||
| + | |||
| + | Az eredmény: | ||
| + | |||
| + | < | ||
| + | a = 3 | ||
| + | b = 5 | ||
| + | </ | ||
| + | |||
| + | A modern programokban azonban általában jobb ideiglenes változót vagy beépített felcserélő műveletet használni, mert az érthetőbb és kevésbé hibalehetőséges. | ||
| + | |||
| + | === Ellenőrzőérték és paritás számítása === | ||
| + | |||
| + | Az XOR művelet egyszerű hibafelismerésre is használható. Több adatbájt XOR műveletével egy ellenőrzőérték képezhető: | ||
| + | |||
| + | < | ||
| + | ellenorzoertek = adat1 XOR adat2 XOR adat3 | ||
| + | </ | ||
| + | |||
| + | Ha valamelyik adatbit megváltozik, | ||
| + | |||
| + | Az XOR fontos szerepet játszik például: | ||
| + | |||
| + | * a paritásbitek előállításában; | ||
| + | * egyszerű ellenőrzőösszegek számításában; | ||
| + | * CRC-alapú hibafelismerésben; | ||
| + | * RAID adattárolási rendszerekben; | ||
| + | * folyamtitkosítókban; | ||
| + | * bitek és állapotjelzők átkapcsolásában. | ||
tanszek/oktatas/szamitastechnika/binaris_muveletek.txt · Last modified: by knehez
