IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Bibliothèque / code simple pour utiliser le RSA et générer des clés


Sujet :

C++

  1. #1
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut Bibliothèque / code simple pour utiliser le RSA et générer des clés
    Salut

    Je recherche comme dit dans le titre un moyen simple d'implémenter le RSA. Je n'ai pas de contraintes sur l'algorithme, je veux juste pouvoir coder, décoder, et générer la clé à partir d'un générateur de nombre aléatoire à moi ou alors avoir une fonction qui pour la même chaine / entier donné en paramètre renvoie toujours la même clé RSA.

    J'ai regardé cryptoC++ malheureusement je n'ai pas réussi à le compiler en dll jusqu'au bout sous windows et en plus le fichier .A faisait à la fin 19 Mo ce qui est beaucoup trop.

    J'aimerais aussi que ce soit une solution portable.

    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    En fait, on ne crypte pas les données avec RSA. C'est beaucoup trop gourmand, et il faudrait une clef de la même taille que les données, ce qui demanderait bien trop de calcul.

    Ce qu'on fait, c'est qu'on utilise RSA pour crypter la clef d'un algo symétrique, typiquement AES ou RC4.

    Si c'est pour du réseau, tu as lib SSL qui gère comme son nom l'indique du SSL, mais aussi du TLS si tu as besoin.

    Sinon, plus généraliste, tu as libcrypto++, un lib crypto pour le C++.

  3. #3
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Non je veux juste utiliser le RSA pour faire passer qqchose de très léger (en utilisant le fait que ce soit du cryptage asymétrique), genre 8 octets...

    J'ai vu libcrypto++, mais est-elle disponible déjà compilée pour mingw? Et ça semble bouffer énormément de place, au moins 19 mo, alors que je veux juste le RSA.

    Je vais voir lib ssl, si j'arrive à compiler seulement la partie RSA (moins d'1 mo serait bien pour la dll...)

    Merci

    edit: en fait, le cryptage RSA a l'air simple à mettre en place, il ne me manque que la génération de clé à partir d'une graine pour faire ce que je veux (transmettre par ex un bloc de 128 octets au début de la communication)

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Si ton compilo est bien fichu, il doit éliminer le code mort et donc ta lib ne sera pas grosse au final.

    EDIT: La complexité du RSA réside dans la génération de clef. C'est en général la que se situent les failles.

    Si tu n'utilise pas un algo de chiffrement par blocs, comme AES ou RC4, tu cryptage sera faible devant une attaque statistique. C'est juste totalement ridicule de faire du RSA pour en faire cela.

  5. #5
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Je veux pouvoir réaliser un programme qui se connecte sur un serveur sans que le serveur n'ait les informations nécessaires pour pouvoir se faire passer pour le client + tard pour un autre serveur.

    Je veux aussi que si le client installe le programme sur un ordinateur, rentre son mot de passe, et que s'il installe le programme sur un autre ordinateur et rentre encore le mot de passe il puisse toujours s'identifier sur les serveurs sans soucis.

    D'où 1 mot de passe = une clé. (on peut faire un MD5 du mot de passe pour avoir qqchose qui se rapproche d'un grand entier à partir d'une chaine de caractères, on peut utiliser 32 bits l'entier pour un générateur de nombre aléatoire du type mersenne et rajouter de l'entropie en faisant des manips en fonctions des 32 bits restants)

    Bien sûr, le point faible est que si le client utilise des mots de passes faibles, il sera pas protégé, mais là c'est complètement de sa faute.

    Après une fois que le client a sa clé RSA publique/privée il suffit que lors de la première connexion le serveur conserve une empreinte de la clé publique et que lors des connexions futures le serveur envoie un message aléatoire cryptée par la clé publique et le client renvoie le message en clair pour s'identifier (d'où le fait qu'on n'ait pas besoin de crypter beaucoup de données...)

    Là encore on est vulnérable à des attaques de man in the middle ou autres, mais je considère que l'attaquant n'a pas les moyens de faire de telles choses, que la seule manière qu'il a d'attaquer est de retrouver le mot de passe du client à partir des données sur le serveur.

    Enfin là il semble que j'arrive à faire marcher ça, je reposterais si j'ai des problèmes ^^

    (et je précise que ce n'est pas du tout à usage professionel, juste pour un jeu ou je veux pas que les admins d'un serveur en se connectant sur d'autres serveurs compromettent la sécurité de leur mot de passe)

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Ce que tu cherche à faire existe déjà, c'est TLS, et cela est géré par libopenssl.

    Et en bonus, ce n'est pas faible devant un man in the middle.

  7. #7
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Ce que je voulais dire par faible par man in the middle, c'est que l'authentification est protégée mais par la suite le reste du transit est en clair donc l'attaquant, s'il est au milieu, peut prendre le controle de la connexion (pour mon programme ...)

    En tout cas merci pour l'info, et si c'est bien ce que je cherche (par ex génération d'une clé RSA à partir d'une chaine de caractère ou autre) je vais essayer de compiler cette *** de ssl.

    Merci!

    EDIT:

    En fait le TLS c'est du SSL, tout ce que j'ai besoin en définitive c'est d'une fonction qui permette de générer un couple de clés à partir d'un mot de passe (sinon soit je devrais donner trop d'information au serveur, authentification faible; ou alors si je veux utiliser le programme sur un autre ordi je devrais copier le certificat)

    Il y avait ça avec crypto++, je vais tenter de compiler.. Mais j'en ai vraiment marre, pourquoi sous linux il y a tous les paquets de prêt pour toutes les bibliothèques et sous windows on a 36000 erreurs à moins d'utiliser CygWin/Visual Studio et rien de déjà compilé...

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    La génération de clef ) partir de mot de passe, je sais que ssh le fait. Il doit utiliser libopenssl pour ça, mais sur ce coup la je ne suis pas bien sur.

    TLS et SLL ne sont aps exactement la même chose. Si dans les deux cas il s'agit d'un socket sécurisé (c'est donc très pratique vis à vis du reste du code : c'est transparent) l'authentification e TLS est bidirectionelle, alors qu'en SLL, seul le serveur est authentifié.

    Un deuxième solution est de faire un SSL vers le server, et d'authentifier à travers le SLL avec un basique login/pass, et de gérer l'authentification à la couche session. Cette solution est plus souple, mais demande que tu gère l'authentification du client toi-même.

  9. #9
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    ok merci

    je vais donc voir avec openssl.

    En tout cas là j'ai compilé un hello world basique en rajoutant les autres fichiers de crypto++ et j'ai 3,5 MB au lieu de qqs kb avec toutes les optimisations : moralité, mingw n'enlève pas le code mort (ici le main est totalement indépendant des fichiers de crypto++), je devrais utiliser un autre compilateur pour le programme final....

    bon je crois qu'on peut mettre résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/06/2010, 16h38
  2. [EDP]Cherche code simple pour maillages, resolution EDP, etc
    Par hollowdeadoss dans le forum MATLAB
    Réponses: 1
    Dernier message: 14/03/2008, 10h57
  3. Réponses: 27
    Dernier message: 14/12/2006, 19h49
  4. Réponses: 2
    Dernier message: 08/04/2004, 11h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo