First padding oracle definition version
This commit is contained in:
parent
5effc75823
commit
adb0113f93
1 changed files with 49 additions and 3 deletions
52
memoire.md
52
memoire.md
|
@ -249,10 +249,8 @@ Contrairement au chiffrement de flux, le chiffrement par bloc nécessite une
|
||||||
taille de donnée définie en entrée. Si les données sont trop importante, il faut
|
taille de donnée définie en entrée. Si les données sont trop importante, il faut
|
||||||
les découper, si elle sont plus petite on utilisera la technique du padding.
|
les découper, si elle sont plus petite on utilisera la technique du padding.
|
||||||
|
|
||||||
Transposer sous forme d'équation cela donnerait :
|
|
||||||
|
|
||||||
```
|
```
|
||||||
txt_dechiffré[n] = dechiffrement(c_block[n]) ⊕ c_block[n-1]
|
txt_dechiffre[n] = dechiffrer(c_block[n]) ⊕ c_block[n-1]
|
||||||
```
|
```
|
||||||
|
|
||||||
##### Le padding
|
##### Le padding
|
||||||
|
@ -265,6 +263,54 @@ valeur hexadécimale `0x03` qui représente le nombre d'octets manquant [2].
|
||||||
|
|
||||||
##### L'attaque par oracle de padding
|
##### L'attaque par oracle de padding
|
||||||
|
|
||||||
|
Une **oracle de padding** est un mechanisme prenant un bloc chiffré en entrée,
|
||||||
|
de déchiffre et averti l'utilisateur si le padding est correct ou non.
|
||||||
|
|
||||||
|
Le chiffrement par bloc en mode *CBC* a un énorme défaut : l'intégrité des
|
||||||
|
messages n'est pas vérifiée. Du coup un attaquant peut modifier le résultat
|
||||||
|
de `txt_dechiffre[n]` en modifiant `c_block[n-1]`, ou tout simplement en le
|
||||||
|
forgeant à notre convenance.
|
||||||
|
|
||||||
|
Prenons `X` comme bloc de chiffrement forgé pour l'occasion, et `c_block[a]`
|
||||||
|
bloc de chiffrement à attaquer, nous pouvons écrire :
|
||||||
|
|
||||||
|
```
|
||||||
|
t_clair_hack[a] = dechiffrer(c_block[n]) ⊕ X
|
||||||
|
```
|
||||||
|
|
||||||
|
Nous savons aussi que :
|
||||||
|
|
||||||
|
```
|
||||||
|
c_block[a] = chiffrer(txt_clair[a] ⊕ c_block[a-1])
|
||||||
|
```
|
||||||
|
|
||||||
|
Donc on peut écrire :
|
||||||
|
|
||||||
|
```
|
||||||
|
t_clair_hack = dechiffrer(chiffrer(txt_clair[a] ⊕ c_block[a-1])) ⊕ X
|
||||||
|
# et en simplifiant
|
||||||
|
t_clair_hack = txt_clair[a] ⊕ c_block[a-1] ⊕ X
|
||||||
|
```
|
||||||
|
|
||||||
|
Cette équation se compose de deux éléments que nous avons en notre possession :
|
||||||
|
`X` notre bloc forgé et `c_block[a-1]` notre avant-dernier bloc, et deux
|
||||||
|
éléments inconnus : `t_clair_hack` le résultat en clair de la manipulation de
|
||||||
|
notre attaque et `txt_clair[a]` le résultat du déchiffrement de `c_block[a]`.
|
||||||
|
|
||||||
|
Il n'est plus question ici de chiffrement, mais de simples opérations booléenne.
|
||||||
|
|
||||||
|
Comme nous avons accès à une **oracle de padding** nous n'avons qu'a tester
|
||||||
|
toutes les valeurs du dernier octet de `X` jusqu'à obtenir un padding correct
|
||||||
|
(`0x01`). Dans le cadre de notre block de 16 octets :
|
||||||
|
|
||||||
|
```
|
||||||
|
0x01 = txt_clair[a][15] ⊕ c_block[a-1][15] ⊕ X[15]
|
||||||
|
```
|
||||||
|
|
||||||
|
Il ne nous reste plus qu'une inconnue, nous pouvons résoudre l'équation.
|
||||||
|
|
||||||
|
Il suffit de procéder ainsi pour les 16 octets de notre bloc pour le déchiffrer
|
||||||
|
en entier, et ainsi de suite...
|
||||||
|
|
||||||
## Bibliographie
|
## Bibliographie
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue