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