# 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">
<img src="./img/spn.png">
</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,
		 unsigned short key,
		 unsigned char perm[8],
		 unsigned char subst[16]
	);

    unsigned char decrypt(
		 unsigned char w,
		 unsigned short key,
		 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).