diff --git a/README.md b/README.md
index 3b491f7..36192d1 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,11 @@ Cryptographie - Outils et algorithmes
 
 #### Semaine 1
 - cm : [Chiffrements par bloc, algorithmes à clefs symétriques](cours/crypto.pdf). 
-- tp : [lfsr, tea, hachages](td_tp/tp1)
+- tp : [lfsr, xtea, hachages](td_tp/tp1)
+
+#### Semaine 2
+- cm : [Chiffrements par bloc, algorithmes à clefs publiques](cours/crypto.pdf). 
+- tp : [Substitution-Permutation-Network](td_tp/tp2)
 
 
 
diff --git a/td_tp/tp2/README.md b/td_tp/tp2/README.md
new file mode 100644
index 0000000..2010049
--- /dev/null
+++ b/td_tp/tp2/README.md
@@ -0,0 +1,109 @@
+# 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/SubstitutionPermutationNetwork2.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).
diff --git a/td_tp/tp2/forcebrute/16bits-encrypted.dat b/td_tp/tp2/forcebrute/16bits-encrypted.dat
new file mode 100644
index 0000000..52c5a95
--- /dev/null
+++ b/td_tp/tp2/forcebrute/16bits-encrypted.dat
@@ -0,0 +1 @@
+&&&�S�P�ئ��&쓦Qc&R��R&R�&�ڡ�&�P�&�鐣��&&&�S�P�ئ��&P���c&Q�R�&R��P&�ړ٣Pc&�P�cc���&&&�S�P�ئ��&쓦Qc&R��R&R�&Q�P&�c&�S�P�&&&�S�P�ئ��&쓦Qc&R�&٦��&�)�c&�cR�&&&�S�P�ئ��&쓦Qc&R�&����R&Q�c&�ګ���&&&��&f��P&cR�&f��Pl&R�&Pڡ�&٣R&Pڡ�&&���R[c&�Q&�R&٦�c�&&�S�P�ئ��&쓦Qc��
\ No newline at end of file
diff --git a/td_tp/tp2/forcebrute/16bitsef b/td_tp/tp2/forcebrute/16bitsef
new file mode 100755
index 0000000..0622bf7
Binary files /dev/null and b/td_tp/tp2/forcebrute/16bitsef differ
diff --git a/td_tp/tp2/img/SubstitutionPermutationNetwork2.png b/td_tp/tp2/img/SubstitutionPermutationNetwork2.png
new file mode 100644
index 0000000..078e4d2
Binary files /dev/null and b/td_tp/tp2/img/SubstitutionPermutationNetwork2.png differ
diff --git a/td_tp/tp2/tests/key b/td_tp/tp2/tests/key
new file mode 100644
index 0000000..172c65c
--- /dev/null
+++ b/td_tp/tp2/tests/key
@@ -0,0 +1 @@
+�
\ No newline at end of file
diff --git a/td_tp/tp2/tests/perm b/td_tp/tp2/tests/perm
new file mode 100644
index 0000000..75b57aa
Binary files /dev/null and b/td_tp/tp2/tests/perm differ
diff --git a/td_tp/tp2/tests/spndf b/td_tp/tp2/tests/spndf
new file mode 100755
index 0000000..b8c47c3
Binary files /dev/null and b/td_tp/tp2/tests/spndf differ
diff --git a/td_tp/tp2/tests/spnef b/td_tp/tp2/tests/spnef
new file mode 100755
index 0000000..5bd71f1
Binary files /dev/null and b/td_tp/tp2/tests/spnef differ
diff --git a/td_tp/tp2/tests/subst b/td_tp/tp2/tests/subst
new file mode 100644
index 0000000..432f9b7
Binary files /dev/null and b/td_tp/tp2/tests/subst differ