> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/crypto/symetrique/one-time-pad/attaques.md).

# Attaques

## Mauvaise utilisation

### Réutilisation de la clé

$$
C\_1 = M\_1 \oplus S \enspace et \enspace C\_2 = M\_2 \oplus S \ \ C\_1 \oplus C\_2 = M\_1 \oplus S \oplus M\_2 \oplus S \\\ C\_1 \oplus C\_2 = M\_1 \oplus M\_2 \oplus S \oplus S \\\ C\_1 \oplus C\_2 = M\_1 \oplus M\_2
$$

## Mauvaise de génération de clé

### Clé de taille inférieure à celle du message

todo

### Filtrage d'octets

Certaines implémentations peuvent, à tort, empêcher la clé de contenir certains octets. Si la clé ne peut pas contenir l'octet `0x00` on peut **retrouver le message en clair à condition d'avoir accès à un oracle de chiffrement.**&#x20;

Le chiffrement consiste en une opération `XOR` bit à bit entre le message $$P$$ et la clé $$K$$.

$$
C=P \oplus K
$$

Or $$\forall X, X \oplus 0=X$$ donc la présence d'un `0x00` dans la clé a pour conséquence de ne pas modifier le caractère concerné après le chiffrement. Soit $$C\[i]=P\[i]$$ si $$K\[i]=0$$. **Il est impossible qu'un octet du message chiffré soit égal à l'octet correspondant du clair.**

Si on sait que la clé ne peut pas contenir `0x00` et qu'on la possibilité de chiffrer le message plusieurs fois (avec une clé différente) on peut procéder par élimination pour déterminer les caractères du message clair.

{% hint style="success" %}
Par exemple, si $$C\[i]=`a"$$, on sait que $$P[i]\neq`a"$$.

En répétant cette méthode on peut trouver le seul octet manquant (94 lettres à éliminer si on cherche un caractère ASCII imprimable).
{% endhint %}
