[C] Cryptage du traffic TCP/IP

Cryptage du traffic TCP/IP [C] - C - Programmation

Marsh Posté le 09-03-2005 à 15:02:50    

Bonjour à tous,
J'ai developpé un petit soft serveur/clients en C qui permet d'echanger des fichiers et de s'envoyer des messages. (C'est pas pour faire de la concurence à MSN lol ... ). Tous les clients passent par le serveur pour communiquer.
Maintenant, je recherche des solutions pour crypter toutes les communications TCP entre les clients et le serveur. Je developpe sous Linux debian, j'ai bien sur installé OpenSSL et je compte utiliser ses libraires pour crypter les données.
 Je sais qu'il existe plusieurs types de cryptages pour chiffrer les communications TCP. Soit en utilisant un cryptage symétrique (AES), mais à ce moment là je sais pas du tout comment faire pour échanger la clé secrète de session.  
J'ai vu que Diffie-Hellman pouvait etre une solution mais apparemant trés difficile à programmer en C ou meme d'implémenter à partir d'OpenSSL.
Il existe aussi une autre solution pour échanger la clé secrètre, c'est celle qu'utilise SSL. On crypte alors la clé secrète avec du RSA pour la transmettre. Cette solution aussi m'interesse beaucoups.
J'ai aussi pensé à utiliser une architecture PKI. Le serveur qui relie les clients serai alors le CA ( authorite de certification ). Au moment de la connexion, le serveur transmet son certificat auto-signé par lui meme au client, le certificat contient la clé publique du serveur. Cette clé permettra de transemttre la clé symétrique de session. Je demande donc aux conaisseurs de cryptographie de me donner quelques conseils:
-Quelle solution retenir ?
-Comment implémenter de l'AES pour crypter du TCP.
-Est ce que c'est facile d'utiliser les libraires d'OpenSSL pour réalier tout ca?
-Connaisez vous des livres ou des liens ou je peux trouver quelque chose de similaire ?
-Que sera l'impact sur les performances des échanges entres clients/serveur ?
 
Merci pour vos suggestions .

Reply

Marsh Posté le 09-03-2005 à 15:02:50   

Reply

Marsh Posté le 09-03-2005 à 16:18:52    

je relance :)

Reply

Marsh Posté le 09-03-2005 à 20:39:14    


 
Laisse quand même aux gens le temps de se connecter, lire et répondre avant de relancer...
 
En cryptographie, la solution souvent la meilleure est la suivante
1) crypter le message avec cryptage symétrique car très rapide
2) échanger la clef secrète via RSA très long mais pas grave car donnée à crypter très petite
 
L'algorithme de Diffie-Hellman peut-être, à mon avis, beaucoup plus approprié pour ton problème car il est assez rapide et son seul inconvénient est que les deux programmes doivent avoir au-moins un échange complet pour que l'algo soit déroulé en entier. Mais cet inconvénient te concerne pas puisque les programmes dialogueront en permanence. Et, contrairement à ce que tu dis, il est très facile à implémenter en C car son principe est très simple.
 
Les deux personnages A et B qui veulent échanger des données doivent établir une clef secrète et commune. L'algo sert juste à calculer la clef secrète et commune aux deux perso sans que la clef ne traverse le réseau.
Chacun des deux personnages se choisi un nombre perso secret appelé "S"
On a donc Sa et Sb les nombres choisis pas "A" et "B"
Les deux perso choisissent en commun deux nombres "M" et "P". Ils sont pas secret puisqu'ils doivent avoir les mêmes nombres donc les nombres seront communiqués via réseau et seront connus.
Ensuite, A calcule (M exp Sa) mod P. Ca donne un résultat Ra qui est transmis à B. B calcule alors (Ra exp Sb) mod P. Ca donne un autre résultat Kb
Puis B calcule (M exp Sb) mod P. Ca donne un résultat Rb qui est transmis à A. A calcule alors (Rb exp Sa) mod P. Ca donne un autre résultat Ka
Eh bien en final, Ka et Kb sont identique (K) et peuvent servir de clef de cryptage secrète. Et ni M, ni P, ni Ra ni Rb qui ont circulé ne permettent de trouver K sans Sa ou Sb qui restent secrets.
Cet algo a servi de base à RSA
 
Exemple: m=47, p=719, Sa=888, Sb=101
A calcule (47 exp 888) mod 719 => 60 et transmet 60 à B
B calcule (60 exp 101) mod 719 => 617
B calcule ensuite (47 exp 101) mod 719 => 342 et transmet 342 à A
A calcule (342 exp 888) mod 719 => 617
Le nombre 617 peut servir de clef de cryptage symétrique
 
Et pour calculer (47 exp 888) mod 719, comme c'est égal à (((47 exp 887) mod 719) * 47) mod 719, il te suffit de programmer une boucle de multiplication en calculant le modulo dans la boucle, ce qui te permet de ne pas avoir de nombres gigantesques.


Message édité par Sve@r le 09-03-2005 à 20:40:40
Reply

Marsh Posté le 09-03-2005 à 23:51:09    

Reply

Marsh Posté le 10-03-2005 à 10:30:41    

Merci Sve@r pour ta réponse. Pour l'instant j'étudie les différentes manières de faire. Je compte implémenter mon cryptage symétrique à partir des libraires OpenSSL. Mais j'sais toujours pas si c'est facile de crypter un flux TCP avec les libraires OPENSSL. Puis j'aurai bien voulu avoir une réponse sur la solution PKI ou le serveur delivre un certificat aux clients...
Si vous avez des url intéressentes j'suis prenneur

Reply

Marsh Posté le 10-03-2005 à 13:41:54    

hop hop

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed