Bcrypt

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

bcrypt est un algorithme de chiffrement créé par Niels Provos et David Mazières. Il est basé sur l'algorithme de chiffrement Blowfish et a été présenté lors de USENIX en 1999[1]. En plus de l'utilisation d'un sel pour se protéger des attaques par table arc-en-ciel (rainbow table), bcrypt est une fonction adaptative, c'est-à-dire que l'on peut augmenter le nombre d'itérations pour le rendre plus lent. Ainsi il continue à être résistant aux attaques par recherche exhaustive malgré l'augmentation de la puissance de calcul.

Blowfish est un algorithme de chiffrement par bloc notable pour sa phase d'établissement de clef relativement coûteuse. bcrypt utilise cette propriété et va plus loin. Provos et Mazières ont conçu un nouvel algorithme d'établissement des clefs nommé Eksblowfish (pour « Expensive Key Schedule Blowfish »). Dans cet algorithme, une première phase consiste a créer les sous-clefs grâce à la clef et au sel. Ensuite un certain nombre de tours de l'algorithme standard blowfish sont appliqués avec alternativement le sel et la clef. Chaque tour commence avec l'état des sous-clefs du tour précédent. Cela ne rend pas l'algorithme plus puissant que la version standard de blowfish, mais on peut choisir le nombre d'itérations ce qui le rend arbitrairement lent et contribue à dissuader les attaques par table arc-en-ciel.

Le nombre d'itérations doit être une puissance de deux, c'est un paramètre de l'algorithme et ce nombre est codé dans le résultat final.

Après la première implémentation dans OpenBSD, cet algorithme s'est généralisé et est maintenant disponible dans un grand nombre de langages (Java, Python, C#, Ruby, Perl, PHP 5.3+, etc).

Algorithme[modifier | modifier le code]

L'algorithme dépend fortement de l'établissement des clefs de la méthode « Eksblowfish » :

EksBlowfishSetup(cost, salt, key)
    state \gets InitState()
    state \gets ExpandKey(state, salt, key)
    repeat (2cost)
        state \gets ExpandKey(state, 0, key)
        state \gets ExpandKey(state, 0, salt)
    return state

Cette méthode prend trois paramètres :

cost 
le coût souhaité de l'algorithme. C'est la puissance de deux du nombre d'itération choisi.
salt 
sel de l'algorithme
key 
le mot de passe que l'on souhaite encoder

InitState fonctionne de la même manière que dans l'algorithme Blowfish original, le P-array et le S-bow sont initialisés avec la partie décimal de \pi en hexadécimal.

La fonction ExpandKey peut se décrire ainsi :

ExpandKey(state, salt, key)
    for(n = 1..18)
        Pn \gets key[32(n-1)..32n-1] \oplus Pn //treat the key as cyclic
    ctext \gets Encrypt(salt[0..63])
    P1 \gets ctext[0..31]
    P2 \gets ctext[32..63]
    for(n = 2..9)
        ctext \gets Encrypt(ctext \oplus salt[64(n-1)..64n-1]) // Encrypt utilise la clef actuelle et le sel sous forme cyclique
        P2n-1) \gets ctext[0..31]
        P2n \gets ctext[32..63]
    for(i = 1..4)
        for(n = 0..127)
            ctext \gets Encrypt(ctext \oplus salt[64(n-1)..64n-1]) // comme au-dessus
            Si[2n] \gets ctext[0..31]
            Si[2n+1] \gets ctext[32..63]
    return state

Sources[modifier | modifier le code]

Notes et références[modifier | modifier le code]

  1. Niels Provos et Talan Jason Sutton 2012, « A Future-Adaptable Password Scheme », Proceedings of 1999 USENIX Annual Technical Conference,‎ 1999, p. 81–92 (lire en ligne)

Liens Externes[modifier | modifier le code]