Hlavní navigace

Python Cryptography Toolkit (5)

21. 3. 2005
Doba čtení: 3 minuty

Sdílet

V dnešním (posledním) dílu se podíváme na modul Util. Hlavně se zaměříme na generátory náhodných čísel.

Crypto.Util.number

Tento modul obsahuje různé funkce zabývající se čísly

GCD(x, y)
Vrací největší společný dělitel čísel x a y.
getPrime(N, randfunc)
Vrací Nbitové náhodné prvočíslo, přičemž používá náhodná data získaná z funkce randfunc. Ta musí přebírat jeden celočíselný argument a vracet řetězec náhodných dat o odpovídající délce. Je vhodnější použít metodu get_byte z třídy RandomPool než metodu read() čtoucí např. z /dev/random.
getRandomNumber(N, randfunc)
Vrací Nbitové náhodné číslo, přičemž používá funkci randfunc.
inverse(u, v)
Vrací převrácenou hodnotu operace u modulo v.
isPrime(N)
Vrací true, jestliže je N prvočíslo.

Crypto.Util.ran­dpool

Běžné generátory náhodných čísel jsou pro kryptografické účely mnohdy nedostačující, protože je často možné z výstupu odvodit předchozí nebo i budoucí výstup. Při generování klíče by mohlo problém vyřešit použití silné šifry nebo hashovacího algoritmu pro další generování.

Pro generování náhodných čísel je důležitý pojem entropie. Entropie je v podstatě počet možných stavů, které existuji v daných datech. Obvyklou jednotkou jsou bity, takže jeden náhodný bit bude mít entropickou hodnotu právě jeden bit. Jeden náhodný byte bude mít entropickou hodnotu 8 bitů. Mějme příklad, kdy databáze obsahuje datovou oblast specifikující pohlaví osoby. To je reprezentováno jedním znakem „M“ nebo „Z“. Jakou entropii bude mít tato oblast? Protože jsou zde pouze dvě možné hodnoty, není to osm bitů, ale jeden.

Úkolem generátorů náhodných čísel je tedy vytváření dostatku entropických bitů. Tento dostatek je však velmi relativní, protože výkon počítačů se neustále zvyšuje. Pokud například vygenerujete 32bitový RSA klíč, existuje pouze 4,2 miliard možných kombinací. Více informací naleznete v RFC 1750.

Modul randpool implementuje silné generátory náhodných čísel v třídě RandomPool. Vnitřní stav objektu se skládá z řetězce náhodných dat, který je v případě potřeby vrácen.

Cloud23

class RandomPool([num­bytes, cipher, hash])
Objekt třídy RandomPool může být vytvořen bez parametrů – budou použity výchozí hodnoty. numbytes nastaví počet bytů generovaných dat, defaultně je to 160 bytů(1280 bi­tů). hash může být řetězec obsahující jméno modulu hashovací funkce, která bude použita k prohazování náhodných dat, nebo objektu modulu podporujícího hashovací rozhraní. Defaultním hashovacím algoritmem je SHA. Parametr cipher se v této době nepoužívá, byl odstraněn ve verzi 1.1.

Objekt třídy obsahuje následující metody a proměnné:

add_event(time[, string])
Přidá událost do procesu generování, parametr time by měl být nastaven na aktuální systémový čas. string může být řetězec dat, která budou XORována s generovanými daty a mohou být použita ke zvýšení hodnoty entropie. Např. pokud šifrujete dokument, můžete použít hashovou hodnotu dokumentu. Vrácenou hodnotou je obsah proměnné self.entropy před přidáním dat
bits a bytes
Konstantní celočíselné hodnoty obsahující počet bitů/bytů dat v objektu.
entropy
Celočíselná hodnota udávající počet entropických bitů.
get_bytes(num)
Vrací řetězec obsahující num bytů náhodných dat a sníží hodnotu proměnné entropy. Není chybou, když je entropie snížena na 0, nebo když je při této hodnotě funkce volána.
stir()
Zakóduje data v objektu. Tato funkce zničí předcházející stav objektu. Je doporučováno funkci volat před použitím a po použití objektu.
class PersistentRan­domPool(filena­me[, numbytes, cipher, hash])
Tato třída je podtřídou RandomPool. Cesta předaná parametrem filename je automaticky otevřena a data jsou použita v generovacím procesu. Pokud nebude soubor existovat, bude objekt inicializován jako nadřízená třída.
save()
Otevře soubor pojmenovaný parametrem filename a uloží do něj náhodná data. Metoda používá modul pickle.
class KeyboardRandomPool
Třída je podtřídou PersistentRan­domPool a poskytuje metodu k získávání dat z klávesnice.
randomize()
(UNIX) Získá náhodná data z klávesnice. Při tomto procesu se hledí na stisknuté klávesy a na prodlevy mezi jednotlivými stisky.

Tak to by bylo vše. Jelikož tento díl je poslední, nezbývá mi než poděkovat čtenářům a doufat, že se někomu bude tato série hodit.