2025-03-19 18:31:09 +01:00
|
|
|
## TP3
|
|
|
|
|
|
|
|
> Le but du tp est de mettre en oeuvre une communication sécurisée entre
|
|
|
|
> un client et un serveur, en deux phases :
|
|
|
|
> - Echange d'une clé.
|
|
|
|
> - Cryptage de la communication par un algorithme de chiffrement
|
|
|
|
> symétrique à l'aide de la clé echangée. (XTEA pour ce tp)
|
|
|
|
|
|
|
|
[Rappel de cours](../cours/crypto.pdf)
|
|
|
|
|
|
|
|
### Diffie-Hellman
|
|
|
|
<div align="center">
|
|
|
|
<img src="./dh.png">
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Le système (et sa sécurité) de Diffie-Hellman repose sur la difficulté
|
|
|
|
pratique, pour des grands nombres, de calculer le logarithme discret
|
|
|
|
dans un groupe multiplicatif $\mathbb{Z}_{p}^{*}$ avec $p$
|
|
|
|
premier.
|
|
|
|
|
|
|
|
On rappelle que lorsque $p$ est premier, $\mathbb{Z}_{p}^{*}$ est cyclique. Si $g$ est un générateur,
|
|
|
|
tout élément $x\in \mathbb{Z}_{p}^{*}$ s'écrit (de manière
|
|
|
|
unique) sous la forme
|
|
|
|
\[
|
|
|
|
x=g^a,\ \ 1\leq a \leq p-1
|
|
|
|
\]
|
|
|
|
|
|
|
|
<!--\\((\\mathbb{Z}_{p}^{\*},.)\\) est ismorphe au groupe additif
|
|
|
|
\\((\\mathbb{Z}_{p-1},+)\\)-->
|
|
|
|
|
|
|
|
Par définition, $a$ est le logarithme (discret) de $x$ dans la
|
|
|
|
base $g$ noté
|
|
|
|
\[
|
|
|
|
a=\log_{g}(x)
|
|
|
|
\]
|
|
|
|
|
|
|
|
Le schéma en haut de la page illustre comment deux entités peuvent
|
|
|
|
échangés une clef. Alice génére $p$, un générateur $g$. Il
|
|
|
|
choisit un nombre aléatoire $a$ ($2\leq a\leq p-2$), et envoie
|
|
|
|
à Bob le triplet $((p,g,g^a)$. Bob recoit le triplet, et choisit un
|
|
|
|
nombre $b$. Il envoie à Alice $g^b$. La clé calculée par Alice,
|
|
|
|
et Bob est
|
|
|
|
|
|
|
|
\|
|
|
|
|
(g^a)^b = (g^b)^a= g^{ab}
|
|
|
|
\]
|
|
|
|
|
|
|
|
Pour calculer la clé, il faut connaître $ab$. Or seuls $g^a$ et
|
|
|
|
$g^b$ ont été échangés. Ce qui nous ramène au problème du
|
|
|
|
logarithme discret qui est difficile en pratique pour des grands
|
|
|
|
nombres.
|
|
|
|
|
|
|
|
##### Votre travail
|
|
|
|
|
|
|
|
Le but du tp est d'écrire un client/serveur TCP :
|
|
|
|
|
|
|
|
- Le client et le serveur utilise Diffie-Hellman pour échanger une clé
|
|
|
|
sur 16 octets. On utilisera des nombres premiers de Sophie Germain.
|
|
|
|
- Le client saisit un message de l'utilisateur, le chiffre avec XTEA,
|
|
|
|
et envoit le message chiffré.
|
|
|
|
- Le serveur reçoit le message chiffré, le déchiffre, et l'affiche.
|
|
|
|
|
|
|
|
1. Trouver un générateur peut-être long. En effet, tout ce qu'on l'on
|
|
|
|
sait sur l'ordre d'un élément de $\mathbb{Z}_p^{*}$, c'est
|
|
|
|
qu'il divise l'ordre du groupe, i.e $p-1$. Pour que la
|
|
|
|
vérification soit plus rapide, on s'interesse aux nombres premiers
|
|
|
|
dit de Sophie Germain. Ils ont la particularité d'être sous la
|
2025-03-20 16:38:14 +01:00
|
|
|
forme $2q+1$, avec $q$ premier. Ainsi, l'ordre de
|
|
|
|
$\mathbb{Z}_{p}^{*}$ est $2q$. L'ordre possible d'un
|
2025-03-19 18:31:09 +01:00
|
|
|
élément ne peut être que $2$, $q$ ou $2q$. Ce qui fait peu (combien) de
|
|
|
|
test à effectuer quand on cherche un générateur.
|
|
|
|
|
|
|
|
Ecrire un script à l'aide de la commande `primesieve` qui donne
|
|
|
|
tous les nombres premiers de Sophie Germain dans
|
|
|
|
$[2^{62},2^{62}+20000]$. (il faut quelques minutes. Assurez-vous
|
|
|
|
que votre shell permet de représenter de tels nombres. Comment ?)
|
|
|
|
|
|
|
|
2. Ecrire les [fonctions](src/df.c) suivantes :
|
|
|
|
```c
|
|
|
|
typedef unsigned __int128 uint128;
|
|
|
|
typedef unsigned long long int uint64;
|
|
|
|
|
|
|
|
uint64 expm(uint64 m, uint64 e, uint64 n);
|
|
|
|
// calcule m^e modulo n
|
|
|
|
uint64 generateur(uint64 p);
|
|
|
|
// calcule un generateur de (Zp)*
|
|
|
|
// en supposant que p est un nombre premier
|
|
|
|
// de Sophie Germain
|
|
|
|
```
|
|
|
|
Testez ([test_df.c](src/test_df.c)) avec $p = 4611686018427402023$ pour trouver un
|
|
|
|
générateur.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Remarque : pour la génération d'un grand nombre
|
|
|
|
premier, utilisez le programme `primesieve` qsui se trouve dans
|
|
|
|
|
|
|
|
```
|
2025-03-20 15:43:38 +01:00
|
|
|
/export/documents/info/is1+2/asr
|
2025-03-19 18:31:09 +01:00
|
|
|
```
|
|
|
|
.
|