Hlavní navigace

Python Cryptography Toolkit (4)

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

Sdílet

V dnešním dílu se podíváme na protokol umožňující rozkládání a skládání dat a na šifry s veřejnými klíči.

Crypto.Protocol­.AllOrNothing

Tento modul implementuje protokol pro paketovou transformaci all-or-nothing. Předávaná data jsou transformována do bloků zprávy. Všechny bloky musí být tedy obdrženy před provedením opačné transformace, pokud jsou některé bloky poničeny nebo ztraceny, originální data nemohou být obnovena. all-or-nothing není šifra, ačkoliv používá algoritmus blokové šifry. Šifrovací klíč je náhodně generován a je možné ho extrahovat z bloků zprávy.

class AllOrNothing(cip­hermodule, mode = None, IV = None)

Třída implementující all-or-nothing protokol.

ciphermodule je modul obsahující šifrovací algoritmus, který bude použit. Volitelné argumenty mode a IV jsou použity metodou ciphermodule.new(). Při rozkládání a skládání textu musí být všechny tři argumenty stejné.

Modul předaný jako ciphermodule musí zajistit rozhraní definované v PEP 272. Šifrovací klíč je generován automaticky, vždy když je potřeba.

Třída obsahuje dvě metody pro rozkládání a skládání dat z bloků:

digest(text)
Provede transformace řetězce text na bloky dat. Ty jsou uloženy v seznamu řetězců, kde každý řetězce má bitovou délku odpovídající velikosti bloku šifry.
undigest(mblocks)
Provede obrácenou transformaci seznamu bloků zprávy. Funkce vrací řetězec.

Crypto.PublicKey

Všechny doposud popsané šifrovací algoritmy používaly pouze privátní klíče. Stejný klíč byl použit pro šifrování i pro dešifrování. Všechny komunikující strany musely tedy tento klíč znát, aby si mohly předávat data. Může se však stát, že potřebujete komunikovat šifrovanou cestou přes nechráněný kanál. Musíte však také dát nějakým způsobem vědět vašemu protějšku, jaký máte klíč. Elektronickou cestou to není možné, kvůli bezpečnosti. Můžete mu předat klíč také osobně. Daleko vhodnějším řešením se však jeví použití šifer s veřejným klíčem. V tomto systému jsou použity dva rozdílné klíče – jeden pro šifrování a jeden pro dešifrování. Šifrovací (veřejný) klíč může být předán např. pomocí e-mailu, privátní klíč musí být stále ve vašich rukou. Data zašifrovaná veřejným klíčem můžete poté velice jednoduše rozšifrovat svým privátním klíčem.

Díky tomuto principu je vhodným použitím těchto algoritmů také podepisování e-mailů. Jednoduše zprávu podepíšete svým privátním klíčem, a kdokoliv si může ověřit její pravost vaším veřejným klíčem.

Algoritmy použité v balíku:

Algoritmus Použití
RSA Šifrování, autentizace/po­depisování
ElGamal Šifrování, autentizace/po­depisování
DSA Autentizace/po­depisování
qNEW Autentizace/po­depisování

Příklad použití algoritmu s veřejným klíčem:

>>> from Crypto.Hash import MD5
>>> from Crypto.PublicKey import RSA
>>> RSAkey = RSA.generate(384, randfunc)
>>> hash = MD5.new(plaintext).digest()
>>> signature = RSAkey.sign(hash, "")
>>> signature   # Vypise jak vypada nas podpis
('\021\317\313\336\264\315' ...,)
>>> RSAkey.verify(hash, signature)     # Overi nas podpis
1
>>> RSAkey.verify(hash[:-1], signature)# A tady nam podpis nesedi
0

Pro vytvoření objektu s novým párem veřejného a privátního klíče slouží funkce generate(size, randfunc, prograss_func = None). size udává velikost generovaného klíče, čím je tato hodnota větší, tím je obtížnější šifru prolomit. randfunc je funkce generující náhodná čísla, musí přijímat jedno celé číslo N jako parametr a vracet řetězec náhodných dat o délce N bytů. Můžete použít generátor obsažený v pycrypto – Crypto.Util.ran­dpool (probereme ho v některém z příštích dílů). Není možné funkci předat aktuální čas nebo funkce z modulu random.

Objekt vrácený funkcí generate bude vždy obsahovat následující metody:

canencrypt()
Vrací pravdivou hodnotu, pokud algoritmus umožňuje šifrovat a dešifrovat data.
cansign()
Vrací pravdivou hodnotu, pokud algoritmus umožňuje podepisovat data.
decrypt(tuple)
Dešifruje n-tici privátním klíčem, přičemž vrací řetězec s daty. Metoda vyvolá výjimku, pokud není znám privátní klíč. Výjimku také vyvolá, jestliže je řetězec moc dlouhý.
encrypt(string, K)
Šifruje string s privátním klíčem. Vrátí n-tici řetězců, délka n-tice je u odlišných algoritmů různá. K je řetězec náhodných dat. Funkce vyvolá výjimku, jestliže je řetězec string moc dlouhý.
hasprivate()
Vrací pravdivou hodnotu, pokud objekt obsahuje data privátního klíče.
publickey()
Vrací veřejný klíč.
sign(string, K)
Podepíše string. Vrácenou hodnotou je n-tice. Teoreticky může vrátit n-tici jakéhokoliv objektu v Pythonu, prakticky se však jedná o čísla nebo řetězce. Různé algoritmy vrací n-tice o rozdílných velikostech. Metoda vyvolá výjimku, pokud je string moc dlouhý.
size()
Vrací maximální délku řetězce, který může být zašifrován nebo podepsán (v bitech).
verify(string, signature)
Ověří string podpisem signature, pokud je vše v pořádku, vrací pravdivou hodnotu.

Tak a to by bylo pro dnešek vše…