Hlavní navigace

Python Cryptography Toolkit (2)

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

Sdílet

V dnešním dílu seriálu o knihovně Python Cryptography Toolkit doděláme hašovací funkce a začneme se zabývat šifrováním dat.

Falšování hašovacího výstupu spočívá v napsání zprávy, která má stejný haš jako originál. V podstatě se jedná o postup pokus-omyl, kdy se musejí přidávat nebo ubírat znaky, aby vznikl kýžený výsledek.

Uvažujme případ, kdy Jana a Petr používají digitální podpisy pro stvrzení své smlouvy. Janin program vypočítá hašovací hodnotu z textu smlouvy a podepíše ji jejím privátním klíčem. Petr by potom mohl podepsat odlišný dokument, který má stejnou hašovací hodnotu. Mohlo by se tedy zdát, že Jana podepsala falešnou smlouvu a nemá šanci prokázat opak.

Pokud má Petr možnost pouze nalézt dvě různé zprávy se stejnou hašovací hodnotou, může podvrženou zprávu změnit, při zachování hodnoty haše, k obrazu svému. Tentokrát je útok pro Petra jednodušší, nicméně Jana se může snažit bránit tím, že před podpisem přidá do smlouvy náhodný řetězec, který poté uchová s digitálním podpisem.

Je možné, že další informace nebudou přesné, a to z důvodů aktualizace (či spíš neaktualizace) dokumentace.

V balíku není implementován žádný „nebezpečný“ algoritmus. Tzn. ani jeden z algoritmů nebyl celý prolomen. Velice bezpečným se zdá algoritmus MD2, který nebyl nikdy (ani z části) prolomen. Velkým neduhem tohoto algoritmu je však jeho rychlost (spíše pomalost), ta činí jen 1250 K/s. Naproti tomu MD4 je mnohem rychlejší – 44 500 K/s, jsou však známy některé částečné útoky na něj. Algoritmus MD4 vytváří tři opakované jednoduché mixovací operace, dva z těchto tří okruhů byly dešifrovány, zatím ale není možné prolomit celý algoritmus. MD5 je zesílená verze algoritmu MD4 se čtyřmi okruhy. MD5 je stále považován za bezpečný. Nyní se však přechází k algoritmu SHA, na který dosud není znám úspěšný útok. V balíku je však MD5 implementován s mírnou optimalizací, a vyvstává tedy otázka, který ze dvou výše uvedených algoritmů použít. Je také možné, že MD5 (rychlost 35 500 K/s) bude v závislosti na procesoru a kompilátoru rychlejší než MD4.

Všechny MDn algoritmy produkují 128-bit haše, SHA produkuje delší – 160-bit – haš, a ten nebyl zatím prolomen. První verze SHA byla relativně náchylná, druhá verze tento problém vyřešila. Kód použitý v tomto balíku je implementací druhé verze (její rychlost je 21 000 K/s). RIPEMD má také 160-bit výstup a pracuje s rychlostí 17 000 K/s.

Crypto.Cipher: Šifrovací algoritmy

Asi každý ví, co to šifrování je. Tak tedy jen ve zkratce: Při šifrování jsou vstupní data transformována určitou metodou (ta záleží na algoritmu) za použití klíče na výstupní zašifrovaná data. Na rozdíl od hašovacích algoritmů je možné zašifrovaná data pomocí klíče snadno rozšifrovat. Bezpečnost algoritmu se samozřejmě určuje podle obtížnosti prolomení šifry bez znalosti klíče. Většina útoků však není moc dokonalá, a tak jedinou „schůdnou“ cestou k prolomení šifry je zkoušet všechny možné klíče. Při tomto brute-force útoku je počet kombinací 2 ** 56 nebo 2 ** 128. 56-bit šifry jsou v současné době považovány za nedostatečné.

Blokové šifry pracují tak, že na vstupu převezmou vícebytová data (většinou 8 nebo 16 bytů) a zašifrují je. Blokové šifry mohou pracovat v různých módech. Nejjednodušší je Electronic Code Book (ECB) mód. V tomto módu je každý blok dat „pouze“ zašifrován, což však může být nebezpečné. V případě, že máme ve výchozích datech nějaké stále se opakující sekvence, budou tyto sekvence také stejně zašifrovány. Schopný útočník může využít tyto bloky dat k získání informací o vstupu.

skoleni

Pro eliminaci této slabiny jsou v balíku módy, které kombinují vstupní data s již zašifrovanými, čímž se snižuje výskyt opakujících se bloků dat ve výstupu. Těmito módy jsou Cipher Block Chaining (CBC) aCipher FeedBack (CFB). CBC mód pracuje v blocích, a tudíž je jen mírně pomalejší než ECB mód. CFB mód šifruje na bázi byte-by-byte a je mnohem pomalejší než oba předchozí. Tyto módy však navíc požadují inicializační posloupnost dat, tou je řetězec o velikosti jednoho bloku algoritmu, který je předáván funkci new(). V balíku je také použit speciální PGP mód, který je variantou CFB používanou programem PGP.

To by bylo pro dnešek vše, příště se podíváme, jaké že to algoritmy v pycrypto jsou.