Jak je obecně známo, veškeré informace v počítači se přenáší pomocí nul a jedniček. V paměti počítače se bloky nul a jedniček ukládají v buňkách, které reprezentují bity, tedy bit může nabývat hodnoty nula nebo jedna - nic jiného (pokud neuvažujeme kvantové počítače a kvantové bity, které jsou v roce 2018 stále spíše science fiction). Dle architektury tvoří obvykle osm bitů jeden bajt (v některých architekturách je to např. pouze sedm bitů).
V rámci uložené informace v různých datových typech (např. integer, boolean, ale i string) se můžeme tím či oním způsobem dostat k jejich bitové reprezentaci (tj. posloupnosti nul a jedniček). Na této bitové úrovni se nechají provádět některé základní operace booleovy algebry. Mezi základní operace patří NOT, AND, OR, XOR, rotace a bitový posun. Ve většině programovacích jazyků existuje operand, který dané operace provádí (většinou nad celočíselnými typy - proto jsou tak oblíbené).
Je také vhodné mít na paměti, že bitová reprezentace jakéhokoli typu může být vždy chápána jako číslo zapsané ve dvojkové soustavě. To je poměrně šikovné, protože některé operace (viz bitový posun) má smysl vnímat v tomto úhlu pohledu.
Tyto operace jsou nejen v kryptografii mimořádně důležité, proto jsou níže jedna po druhé vysvětleny.
Jsou operace prováděné v rámci Booleovy algebry. Mohou být unární (mají jen jeden operand), což je například negace NOT. Dále mohou být binární (mají dva operandy), což jsou především operace AND, OR a XOR (jsou i jiné, např. NAND, NOR, implikace, ekvivalence).
Je unární operace. Značí logickou negaci. Značí se obvykle nadtržením (opak podtržením) dané proměnné, například A, případně pouze jako NOT(A). Má následující logickou tabulku:
| A | A |
|---|---|
| 0 | 1 |
| 1 | 0 |
V jazyce Python se provádí (pro proměnnou x) zápisem: ~x. Tato operace vrátí proměnnou, která má negované všechny bity.
Je binární operace. Značí logickou konjunkci (násobení, jazyková spojka: a). Značí se obvykle pomocí stříšky ∧ (A∧B) či jako standardní násobení · (A·B). Má následující logickou tabulku:
| A | B | A·B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
V jazyce Python se provádí (pro proměnné x a y) zápisem: x & y. Tato operace vrátí proměnnou, kde každý bit je konjunkce bitu na stejném pořadí u proměnné x a y.
Je binární operace. Značí logickou disjunkci (sčítání, jazyková spojka: nebo). Značí se obvykle pomocí obrácené stříšky ∨ (A∨B) či jako standardní sčítání + (A+B). Má následující logickou tabulku:
| A | B | A+B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
V jazyce Python se provádí (pro proměnné x a y) zápisem: x | y. Tato operace vrátí proměnnou, kde každý bit je disjunkce bitu na stejném pořadí u proměnné x a y.
Je binární operace. Značí logickou non ekvivalenci (negace ekvivalence, jazyková spojka: výlučně nebo; a nebo). Značí se obvykle pomocí plusu v kolečku ⨁ (A ⨁ B). Má následující logickou tabulku:
| A | B | A ⨁ B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
V jazyce Python se provádí (pro proměnné x a y) zápisem: x ^ y. Tato operace vrátí proměnnou, kde každý bit je non ekvivalencí bitu na stejném pořadí u proměnné x a y.
Představují operace, při kterých se všechny bity daného slova posunou o určitý počet bitů v určitém směru.
Pokud provádíme bitový posun vpravo o k bitů, tak vlastně dělíme číslo příslušnou mocninou 2k.
Např: posun čísla 101101 o dva bity vpravo dává: 1011 (jakoby zmizí dvě čísla napravo), posun čísla 101101 o tři bity vpravo dává: 101 (jakoby zmizí tři čísla napravo), a tak dále.
V jazyce Python (a ve většině jiných jazyků) se bitový posun proměnné x o k bitů vpravo značí jako x >> k
Pokud provádíme bitový posun vlevo o k bitů, tak vlastně násobíme číslo příslušnou mocninou 2k.
Např: posun čísla 101101 o dva bity vlevo dává: 10110100 (napravo se přidávají dvě nuly), posun čísla 101101 o tři bity vlevo dává: 101101000 (napravo se přidávají tři nuly), a tak dále.
V jazyce Python (a ve většině jiných jazyků) se bitový posun proměnné x o k bitů vlevo značí jako x << k
Představuje oblíbenou kryptografickou operaci. Z matematického hlediska nemá jasný význam (kromě toho, že se jedná o speciální druh permutace).
Například rotace čísla 101101 o dva bity vpravo vrací: 011011.
Rotace čísla 101101 o tři bity vpravo vrací: 101101.
Rotace čísla 101101 o dva bity vlevo vrací: 110110.
Rotace čísla 101101 o tři bity vlevo vrací: 101101.
Ve většině programovacích jazyků (Python nevyjímaje) nemá operace rotace svůj operátor.
Určuje způsob ukládání čísel (či obecně datových typů) v paměti. Jedná se o charakteristickou vlastnost dané počítačové architektury.
Obecná úloha zní: v jakém pořadí uložíme jednotlivé bajty (ne bity!) čísla x do paměti? Adresy buněk v paměti jsou řazeny lineárně vzestupně. Dále předpokládáme, že náš bajt má 8 bitů (což obecně být nemusí).
Předpokládejme například, že pracujeme s číslem 458213, to má v binární soustavě hodnotu (1101111110111100101)2, pro 32 bitovou architekturu bychom tedy ukládali do paměti číslo ve formě, rozděleno na bajty: (00000000 00000110 11111101 11100101)
Ukládá na první nejnižší adresu v paměti nejnižší bajt z ukládaného čísla (číslo se jakoby překlopí po bajtech). Naše ukázkové číslo by se tedy uložilo jako:
| Uložený bajt: | 11100101 | 11111101 | 00000110 | 00000000 |
|---|---|---|---|---|
| Adresa v paměti: | 0 | 1 | 2 | 3 |
Ukládá na první nejnižší adresu v paměti nejvyšší bajt z ukládaného čísla (na oko přirozenější zápis). Naše ukázkové číslo by se tedy uložilo jako:
| Uložený bajt: | 00000000 | 00000110 | 11111101 | 11100101 |
|---|---|---|---|---|
| Adresa v paměti: | 0 | 1 | 2 | 3 |