Bcrypt
Bcrypt je hašovací funkce pro odvození klíče (key derivation function) navržená Nielsem Provosem a Davidem Mazièresem. Je založena na šifře Blowfish a byla prezentována v USENIXu v roce 1999. Bcrypt v sobě zahrnuje kryptografickou sůl, která chrání proti útokům pomocí duhové tabulky a mimo jiné se jedná o adaptivní funkci. To znamená, že můžeme záměrně zvýšit počet iterací, čímž dojde k jejímu zpomalení. Tím je zajištěna ochrana proti útokům hrubou silou.

Bcrypt je standardizovaná šifrovací funkce pro operační systémy jako BSD a další. Prefix „$2a$“ nebo „$2b$“ (případně „$2y$“) nacházející se v zašifrovaném řetězci označuje, že se jedná o modulární šifrovací formát. Zbytek zakódovaného řetězce se skládá z parametru označujícího dobu šifrování, ze 128bitové kryptografické soli skládající se z 22 znaků zakódovaných base64 kódováním a ze 184 bitů výsledné šifrované hodnoty, rovněž zakódované pomocí funkce base64 do 31 znaků.

Provos a Mazières využili Blowfish algoritmus a vylepšili jej. Vyvinuli pro něj nový algoritmus pro nastavení klíče a nazvali jej „Eksblowfish“. Ten začíná modifikovanou verzí původního algoritmu Blowfish, ve kterém jsou jak kryptografická sůl tak heslo použity pro nastavení všech podklíčů. V následných iteracích je již použit standardní algoritmus Blowfish, využívající střídavě sůl a heslo jako klíč. Každá z těchto iterací začíná podklíčem z předchozí iterace. Ačkoliv se jedná o vylepšení původního algoritmu, výsledná šifra je stejně silná. Jeho výhoda spočívá v umělém zpomalení výpočtu, díky čemuž dochází k lepší ochraně proti útokům hrubou silou.

Vstupem algoritmu je číslo n, určující počet iterací podle vztahu 2n. Toto číslo je součástí zakódovaného řetězce.

Funkce bcrypt je implementována v jazycích Ruby, Python, C, C#, Perl, PHP, Java, JavaScript a dalších.

Algoritmus 
Bcrypt algoritmus velmi závisí na „Eksblowfish“ algoritmu nastavující klíč, který funguje následovně:
 EksBlowfishSetup(cost, salt, key)
     state  InitState()
     state  ExpandKey(state, salt, key)
     repeat (2cost)
         state  ExpandKey(state, 0, key)
         state  ExpandKey(state, 0, salt)
     return state

InitState funguje jako originální Blowfish algoritmus, který naplňuje P-pole a S-boxy desetinnou částí čísla  v hexadecimálním formátu.
ExpandKey funkce dělá následující:
 ExpandKey(state, salt, key)
     for(n = 1..18)
         Pn  key[32(n-1)..32n-1]  Pn 
     ctext  Encrypt(salt[0..63])
     P1  ctext[0..31]
     P2  ctext[32..63]
     for(n = 2..9)
         ctext  Encrypt(ctext  salt[64(n-1)..64n-1]) 
         P2n-1)  ctext[0..31]
         P2n  ctext[32..63]
     for(i = 1..4)
         for(n = 0..127)
             ctext  Encrypt(ctext  salt[64(n-1)..64n-1]) 
             Si[2n]  ctext[0..31]
             Si[2n+1]  ctext[32..63]
     return state

Proto ExpandKey(state, 0, key) je stejný jako rozvrhování klíče normálním algoritmem Blowfish, jelikož všechny funkce XOR s nulovou hodnotou soli nemají žádný efekt. Funkce ExpandKey(state, 0, salt) je podobná, ale používá sůl jako 128bitový klíč.
Celý bcrypt algoritmus využívá tyto funkce pro výpočet hashe z daného vstupu, který je odvozen z hesla. Celý algoritmus funguje následujícím způsobem:
 bcrypt(cost, salt, input)
     state  EksBlowfishSetup(cost, salt, input)
     ctext  "OrpheanBeholderScryDoubt" 
     repeat (64)
         ctext  EncryptECB(state, ctext) 
     return Concatenate(cost, salt, ctext)

Reference

Externí odkazy 

 bcrypt file encryption program homepage

Kryptografické hašovací funkce