Jsou základem informatiky. V rámci moderní kryptologie je jejich perfektní znalost naprosto nepostradatelná. Znamenají operace prováděné na bitové úrovni.

Bitové operace

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.

Logické operace

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

Operace NOT

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:

AA
01
10

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.

Operace AND

Je binární operace. Značí logickou konjunkci (násobení, jazyková spojka: a). Značí se obvykle pomocí stříšky ∧ (AB) či jako standardní násobení · (A·B). Má následující logickou tabulku:

ABA·B
000
010
100
111

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.

Operace OR

Je binární operace. Značí logickou disjunkci (sčítání, jazyková spojka: nebo). Značí se obvykle pomocí obrácené stříšky ∨ (AB) či jako standardní sčítání + (A+B). Má následující logickou tabulku:

ABA+B
000
011
101
111

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.

Operace XOR

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 ⨁ (AB). Má následující logickou tabulku:

ABAB
000
011
101
110

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.

Operace posunu

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.

Bitový posun vpravo

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

Bitový posun vlevo

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

Operace rotace

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.

Endianita

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)

Little-endian

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: 11100101111111010000011000000000
Adresa v paměti: 0123

Big-endian

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: 00000000000001101111110111100101
Adresa v paměti: 0123