2025-03-12 11:11:25 +01:00
|
|
|
# TP2
|
|
|
|
|
|
|
|
> Dans ce tp, on implémente un algorithme de chiffrement par Blocs basé
|
|
|
|
> sur un réseau de permutation-substitution (SPN), en mode ECB.
|
|
|
|
|
|
|
|
|
|
|
|
### SPN
|
|
|
|
|
|
|
|
<div align="center">
|
2025-03-12 11:38:38 +01:00
|
|
|
<img src="./img/spn.png">
|
2025-03-12 11:11:25 +01:00
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ces algorithmes utilisent en entrée une clé, et applique à chaque bloc
|
|
|
|
plusieurs tours constitués de boîtes de substitutions (S-Box) et de
|
|
|
|
boîtes de permutations (P-Box).
|
|
|
|
|
|
|
|
- Une **S-Box** substitue à un ensemble de bits un autre ensembe de
|
|
|
|
bits (transormation bijective).
|
|
|
|
- Une **P-Box** est une permutation de bits. Elle prend la sortie
|
|
|
|
d'une S-Box, permutte les bits, et les transmet à une S-box au tour
|
|
|
|
d'après.
|
|
|
|
- A chaque tour, on combine le bloc avec la clé (ici un xor).
|
|
|
|
|
|
|
|
#### implantation
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- la taille de bloc est 8 bits,
|
|
|
|
- le bloc est découpé en 2 sous-blocs de 4 bits chacun,
|
|
|
|
- la taille de la clef est 16 bits,
|
|
|
|
- la clef est décomposée en 2 sous-clefs de 8 bits chacun,
|
|
|
|
- le nombre de tours est égale à 2,
|
|
|
|
- les substitutions et les permutations sont les mêmes à chaque tour.
|
|
|
|
|
|
|
|
Remarques
|
|
|
|
|
|
|
|
On représentera dans le programme une substitution par un tableau
|
|
|
|
d'entiers (unsigned char) de taille 16.
|
|
|
|
|
|
|
|
```c
|
|
|
|
unsigned char s[]={14,3,2,10,12,11,15,9,0,4,7,13,1,8,6,5}
|
|
|
|
```
|
|
|
|
|
|
|
|
Ainsi, le bloc binaire 0011, qui vaut 3, sera remplacé par 1010 car `s[3]=10`
|
|
|
|
|
|
|
|
On représentera une permutation par un tableau d'entiers (`unisgned char`) de taille 8.
|
|
|
|
|
|
|
|
```
|
|
|
|
unsigned char perm[8]={5,2,0,4,6,1,7,3};
|
|
|
|
```
|
|
|
|
|
|
|
|
Ainsi, le bit de poids faible (rang 0) est placé au rang 5.
|
|
|
|
|
|
|
|
#### Votre travail
|
|
|
|
|
|
|
|
1. Ecrivez les fonctions suivantes, qui implantent le spn décrit ci-dessus.
|
|
|
|
|
|
|
|
```c
|
|
|
|
#ifndef _SPN_H
|
|
|
|
#define _SPN_H
|
|
|
|
|
|
|
|
unsigned char do_perm(unsigned char w,unsigned char perm[8]);
|
|
|
|
unsigned char do_subst(unsigned char w,unsigned char subst[16]);
|
|
|
|
|
|
|
|
unsigned char encrypt(
|
|
|
|
unsigned char w,
|
2025-03-17 10:52:26 +01:00
|
|
|
unsigned short key,
|
2025-03-12 11:11:25 +01:00
|
|
|
unsigned char perm[8],
|
|
|
|
unsigned char subst[16]
|
|
|
|
);
|
|
|
|
|
|
|
|
unsigned char decrypt(
|
|
|
|
unsigned char w,
|
2025-03-17 10:52:26 +01:00
|
|
|
unsigned short key,
|
2025-03-12 11:11:25 +01:00
|
|
|
unsigned char perm[8],
|
|
|
|
unsigned char subst[16]
|
|
|
|
);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
```
|
|
|
|
|
|
|
|
2. Ecrivez des programmes spn-encrypt-file.c , spn-decrypt-file.c qui
|
|
|
|
implantent le SPN décrit ci-dessus. Les deux prennent sur la ligne de
|
|
|
|
commande :
|
|
|
|
|
|
|
|
- un fichier qui contient une clef (un entier non-négatif sur 16 bits),
|
|
|
|
- un fichier qui contient une substitution,
|
|
|
|
- un fichier qui contient une permutation,
|
|
|
|
- "nom fichier codé" et "nom fichier décodé "
|
|
|
|
|
|
|
|
Testez vos programmes sur un exemple à vous. Vérifiez avec les
|
|
|
|
exécutables du répertoire [tests](./tests).
|
|
|
|
|
|
|
|
3. L'exécutable [16btsef](./forcebrute/16bitsef) implante l'algorithme de cryptage ci-dessus avec la substitution
|
|
|
|
|
|
|
|
```c
|
|
|
|
{3,8,14,1,12,5,10,0,2,7,9,11,4,6,15,13}
|
|
|
|
```
|
|
|
|
et la permutation
|
|
|
|
```
|
|
|
|
{5,2,0,4,6,1,7,3}
|
|
|
|
```
|
|
|
|
et une clef de 16 bits.
|
|
|
|
|
|
|
|
- Développez une procédure qui craque cette clef par force brute et
|
|
|
|
qui prend un "temps raisonnable".
|
|
|
|
- Trouvez la clef et décryptez le fichier [16bits-encrypted.dat](./forcebrute/16bits-encrypted.dat).
|