## 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
    forme $2q+1$, avec $q$ premier. Ainsi, l'ordre de
    $\mathbb{Z}_{p}^{*}$ est $2q$. L'ordre possible d'un
    é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

```
/export/documents/info/is1+2/asr
```
.