9°) WEP

  • on code chaque packets en faisant un XOR avec les octets généré par RC4
  • on réinitialise RC4 à chaque packets
  • on utilise pas la clé WEP toute seul. sinon chaque packets est crypté avec la même suite
  • on utilise un clé composé de 16 octets
    • 3 octets "quelconques" (différents pour chaque packets)
    • les B octets de la clé
  • les 3 octets "quelconques" sont ajouter en claire dans le paquet (vecteur d'initialisation)
Pour décrypter, on reconstruit la clé avec le vecteur d'initialisation et on lance RC4
idée:
  • un attaquant connait le début de la clé
  • il connait aussi le premier octet décrypté (0xaa : header "subnetwork access protocol")
  • il connait donc le premier octet généré par RC4 avec la clé incomplete
  • il peut faire le début de l'étape d'initialisation
L'attaque consiste à essayer de deviner le 1er octet de la clé secrète
vecteur "faible":
  • si le vecteur d'initialisation est IV = { 3n, 255, 0 }
  • on connait quelques octet m de la clé.
  • on peut faire les 3+m premières étapes de l'initialisation
  • si à ce moment, on a -P[1]
L'orsque IV est faible, on peut faire une prédiction pour l'octet n de la clé
remarque: quelle est le premier octet généré par RC4 à partir du tableau P complet ?
i=i+1 ; j=j+P[i]=P[1] ; swap(P[1], P[P[1]]) ; P[P[1] + P[P[1]]] = o
si IV est faible, quelle est l'étape suivante (i=k) de l'initialisation ?
i=k ; j=j+P[k]+K[k] ; swap(P[k], P[j]) ;
si IV est faible (condition 2) on échange P[P[1]+P[P[1]]] et P[j]
on a donc k+1 > 1 ; k+1>P[1] (condition 1) ; et P[1]+P[P[1]] = k < k+1

Dans les étapes suivante, la case m=P[1]+P[P[1]] càd m=k est modifier
uniquement lorque j prend la valeur k (i ne peut plus prendre cette valeur)
idem pour les cases 1 et P[1]

Statistiquement j ne prend aucune de ces valeurs dans 5% des cas
Dans ces 5% des cas, l'attaquant connait les valeurs finales de P[1], P[P[1]] et P[P[1]+P[P[1]]]
rappel: lors des étapes k=3+n on échangeait les cases m = P[1]+P[P[1]] connue
et m = j+P[k]+K[m] avec j+P[k] connue
le o généré est donc le contenue P[P[1]+P[P[1]]] du tableau final
c'est à dire le contenue P[j+P[1]+K[m]] du tableau calculé par l'attaquant
on a o=P[j+P[1]+K[m]], on peut chercher le n' de la case qui contient o appelé l
et on a l=j+P[1]+K[m] et donc K[m] = l-j-P[1]
remarque: on obtient une prédiction sur l'octet n de la clé, cette prédiction est fausse dans 95% des case.
5% > (1/255 ⇒ aléatoire) ⇒ si on fait cette prédiction sur beaucoups de paquets,
un nombre va apparaitre plus souvent. C'est cet octet qui est la prédiction finale.
avec 60 prédiction, le resultat finale est correcte dans 50% des cas.
code c89 crack wep (todo)