From 83a304e8a5a1d0090790ec7d3dde78431b121a78 Mon Sep 17 00:00:00 2001
From: Denis Monnerat <monnerat@u-pec.fr>
Date: Wed, 12 Mar 2025 11:11:25 +0100
Subject: [PATCH] tp2

---
 README.md                                     |   6 +-
 td_tp/tp2/README.md                           | 109 ++++++++++++++++++
 td_tp/tp2/forcebrute/16bits-encrypted.dat     |   1 +
 td_tp/tp2/forcebrute/16bitsef                 | Bin 0 -> 10933 bytes
 .../img/SubstitutionPermutationNetwork2.png   | Bin 0 -> 19879 bytes
 td_tp/tp2/tests/key                           |   1 +
 td_tp/tp2/tests/perm                          | Bin 0 -> 8 bytes
 td_tp/tp2/tests/spndf                         | Bin 0 -> 11329 bytes
 td_tp/tp2/tests/spnef                         | Bin 0 -> 11232 bytes
 td_tp/tp2/tests/subst                         | Bin 0 -> 16 bytes
 10 files changed, 116 insertions(+), 1 deletion(-)
 create mode 100644 td_tp/tp2/README.md
 create mode 100644 td_tp/tp2/forcebrute/16bits-encrypted.dat
 create mode 100755 td_tp/tp2/forcebrute/16bitsef
 create mode 100644 td_tp/tp2/img/SubstitutionPermutationNetwork2.png
 create mode 100644 td_tp/tp2/tests/key
 create mode 100644 td_tp/tp2/tests/perm
 create mode 100755 td_tp/tp2/tests/spndf
 create mode 100755 td_tp/tp2/tests/spnef
 create mode 100644 td_tp/tp2/tests/subst

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 0000000000000000000000000000000000000000..0622bf74080dba21adfbcf683fcb66188ca1d35a
GIT binary patch
literal 10933
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
G;r{{px{c=m

literal 0
HcmV?d00001

diff --git a/td_tp/tp2/img/SubstitutionPermutationNetwork2.png b/td_tp/tp2/img/SubstitutionPermutationNetwork2.png
new file mode 100644
index 0000000000000000000000000000000000000000..078e4d240fcc1e4f079a323950a6f4ae937ea97b
GIT binary patch
literal 19879
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
b;qOz@|E~^-Dd0RON>-nWM|}V9gZuvi*7VqC

literal 0
HcmV?d00001

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 0000000000000000000000000000000000000000..75b57aa8c84ae24a8c5b48301b6c17123ef7d5dd
GIT binary patch
literal 8
PcmZQ&VqjroWM>8d0Db@+

literal 0
HcmV?d00001

diff --git a/td_tp/tp2/tests/spndf b/td_tp/tp2/tests/spndf
new file mode 100755
index 0000000000000000000000000000000000000000..b8c47c3b233d4fe826454e42d749aa549b0be1ef
GIT binary patch
literal 11329
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

literal 0
HcmV?d00001

diff --git a/td_tp/tp2/tests/spnef b/td_tp/tp2/tests/spnef
new file mode 100755
index 0000000000000000000000000000000000000000..5bd71f11c6d63979319cef5f1919569a67000929
GIT binary patch
literal 11232
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
A-2eap

literal 0
HcmV?d00001

diff --git a/td_tp/tp2/tests/subst b/td_tp/tp2/tests/subst
new file mode 100644
index 0000000000000000000000000000000000000000..432f9b78514954ff20ec5cb3bf60efdc2b9c3acb
GIT binary patch
literal 16
XcmZSP;A7-r<zirB=j3K#<L3nc1Fryi

literal 0
HcmV?d00001