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

Réseau C Discussion :

Crypter une chaine de caractères


Sujet :

Réseau C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut [RESOLU]Crypter une chaine de caractères
    Bonjour,

    Dans le cadre d'un programme je dois enregistrer le mot de passe de l'utilisateur dans un fichier sur le disque dur. Pour l'instant je l'écris dans un fichier ".passwd" de telle sorte à ce qu'il ne soit pas visible avec une simple "ls". Seulement un "ls -a" l'affiche. Ensuite on peut faire un "cat .passwd" pour voir afficher le mot de passe. Je voudrais donc intégrer un système qui crypte le mot de passe avant de l'inscrire dans le fichier.

    Et puis à un autre niveau, mais toujours pour le meme problème, serait-il possible de développer un algorithme de cryptage qui renderait le mot de passe indécriptable ? Il faudrait alors recrypter le mot de passe saisi par l'utilisateur pour faire la comparaison avec le mot de passe déjà crypté pour savoir si c'est le bon.


    En vous remerciant ...

    Yabo.

  2. #2
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    tu peux utiliser le md5 ki fait exactement ce ke tu veux ( c une fonction de hashage, cad chak chaine est codé de maniere unique mais il est impossible de passer de la chaine cryptée a la chaine de base ( a par brute force)).

    Je connais pas exactement les fonctions associé mais je pense ke c implementé de base dans nux

    ZUL

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    J'ai lu plusieurs fois le man md5 mais impossible d'utiliser les fonctions. Si quelqu'un avait un ptit bout de code ca serait sympa.

    Voilà le code que j'ai (mais qui ne marche pas ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #include <stdio.h>
    #include <openssl/md5.h>
     
    int main() {
     
    char *Password = "Salut";
     
    unsigned char *md;
     
    printf("%s\n",*MD5((char *) Password, strlen(Password),(char *) md);
    return 0;
    }
    Merci

  4. #4
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    En lisant le man, il viendrait plutot ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h> 
    #include <openssl/md5.h> 
     
    int main() { 
    int i;
    char *Password = "Salut"; 
    unsigned char md[MD5_DIGEST_LENGTH];
    MD5(Password, strlen(Password),md); 
    for(i=0;i<MD5_DIGEST_LENGTH;i++)
        printf("%02x",md[i]);
    return 0; 
    }
    Rq: a linker avec ssl (-lssl)

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Ok c'est super ca marche

    Euh c'est indécryptable ce système ?

    Si oui il me faudrait quand même un type de cryptage qui soit décryptable mais pour une autre utilisation

    Dans ce cas ca me donne une chaine assez longue. Je voudrais pouvoir la faire tenir dans une seule variable parceque là on affiche simplement tout les éléments du tableau md[] à la suite les uns des autres ce qui est peu pratique pour faire une comparaison avec un autre mot de passe.

    Merci.

  6. #6
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    le md5 est indecriptable dans le sens ou il n'existe pas de fonction ki a partir d'un code md5 te permette de retrouver le pass d'origine. Le seul moyen (connu) pour decripter un md5 c du brute force,cad essayer toutes les combinaisons jusk'a trouver la bonne (puisk ke a un md5 ne correspond qu'un pass).

    Si je me rappelle bien la longueur d'un md5 est constante.

    Tu peux utiliser strcmp pour comparer avec un autre md5.

    cryptage reversible pas trop dur a implementer or ou vigenere par exemple.

    ZUL

  7. #7
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par zul
    Si je me rappelle bien la longueur d'un md5 est constante.
    Oui : MD5_DIGEST_LENGTH.

    Citation Envoyé par zul
    Tu peux utiliser strcmp pour comparer avec un autre md5.
    Euh, en fait je pense pas que tu puisse consider ca comme une chaine de caractere au sens md5. Je m'explique. Pour md, tu peux avoir le char 0 qui represente juste la valeur 0, mais si tu considere ca comme une chaine, strcmp va croire que c'est la fin. Il considerera le exemple AE0012345678
    et AE0034234532 comme etant "egaux".
    Tu peux creer une chaine de taille 2*MD5_DIGEST_LENGTH. Et tu fait un strcmp, ou sinon tu considere ca comme un tableau d'entier (bon de char en fait).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    char *Password="Salut";
    unsigned char md[MD5_DIGEST_LENGTH];
     
    /* cas 1*/
    char passwd[2*MD5_DIGEST_LENGTH+1]; /* 1 char du md5 -> 2 chars */
    MD5(Password,strlen(Password),md);
    for(i=0;i<MD5_DIGEST_LENGTH;i++)
        sprintf(passwd+2*i,"%02x",md[i]);
    if (strcmp(passwd,passwd2)==0) 
        /* ok */
     
    /* cas 2*/
    for(i=0;i<MD5_DIGEST_LENGTH;i++)
        if (md[i]!=md2[i])
            break;
    if (i==MD5_DIGEST_LENGTH)
        /* ok */

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par D[r
    eadLock]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /* cas 2*/
    for(i=0;i<MD5_DIGEST_LENGTH;i++)
        if (md[i]!=md2[i])
            break;
    if (i==MD5_DIGEST_LENGTH)
        /* ok */
    Tu peux utilise memcmp aussi.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Jai pas tout compris a ton code D[r]eadLock.

    En fait voilà la situation exacte :

    Je fais une appli client/serveur sous forme d'un chat. Lorsque l'on fait un serveur on peut régler plusieurs options tels mettre un mot de passe par exemple. Lorsque le client se connecte il apparait alors une invite lui demandant le mot de passe. Une fois saisi il est envoié au serveur via un socket. Ce que je voudrais c'est que le passe soit crypté du côté client, transmis au serveur et comparé avec le passe originale lui-même crypté.

    Donc il faudrais stocké le mot de passe du client crypté dans une variable (Client_Password) et celle du serveur dans une autre variable (Server_Password). Et ensuite faire une comparais comme si c'étais des char.
    Enfin c'étais mon idée.

  10. #10
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par Yabo
    Ce que je voudrais c'est que le passe soit crypté du côté client, transmis au serveur et comparé avec le passe originale lui-même crypté.

    Donc il faudrais stocké le mot de passe du client crypté dans une variable (Client_Password) et celle du serveur dans une autre variable (Server_Password). Et ensuite faire une comparais comme si c'étais des char.
    Enfin c'étais mon idée.
    Le plus simple est donc ce qui est fait dans le cas 1. Tu cree un chaine de caractere correcte (qui contient en fait ce qui etait dans mon 1er exemple affiche).
    Cote client:
    tu lis le mot de passe, tu le transforme en chaine correcte. Tu transmet donc passwd.

    Cote serveur, tu stocke uniquement les chaines correctes. et tu compares (avec strcmp) la chaine que t'as stockee avec celle que tu recois.

    Par contre le fichier qui contient les mots de passe (pour le root) ne doit pas etre accessible (droits en lecture uniquement au serveur, pas aux clients).

    Citation Envoyé par gl
    memcpy
    Humm, j'y avais pas pense ! (car jamais utilise-> inconnue au bataillon). A mettre quelque part dans un recoin de ma tete.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Mais comme j'ai dis j'ai pas tout compris à ton code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char passwd[2*MD5_DIGEST_LENGTH+1];
    Pourquoi 2*MD5_DIGEST_LENGTH ?

    Où est-ce que tu attribues la valeur du mot de passe crypté à passwd ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     sprintf(passwd+2*i,"%02x",md[i]);
    Je ne comprends pas cette ligne non plus .

    Merci

  12. #12
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par Yabo
    Mais comme j'ai dis j'ai pas tout compris à ton code.
    Xcuse...
    [/quote]

    Citation Envoyé par Yabo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char passwd[2*MD5_DIGEST_LENGTH+1];
    Pourquoi 2*MD5_DIGEST_LENGTH ?
    Car pour chaque char du md, tu affiche 2 caracteres (car c'est un unsigned char, donc sur 8 bits -> affiche en hexa, ca donne 2 caracteres). Exemple si tu as le md[0] qui vaut 63, soit 0x3F, on affichera..... 3f (ici en minuscule avec le x, si tu veux des majuscules, c'est X);

    Citation Envoyé par Yabo
    Où est-ce que tu attribues la valeur du mot de passe crypté à passwd ?
    Avec ce qui suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     sprintf(passwd+2*i,"%02x",md[i]);
    Tu mets dans la chaine passwd, aux caracteres 2i et 2i+1, la representation hexa minuscule (x) sur 2 caracteres (2), completee par un 0 si besoin (0 : si 4 -> 04, comme ca on a toujours 2 chars).

    C'est un peu plus clair ?

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Et donc ensuite je peux faire un simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%s",passwd);
    ?

  14. #14
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Oui mais il afichera le mot de passe chiffrer et non le mot de passe en clair. Le code de D[r]eadLock utilise un mot de passe en dur ("salut") pou le test, il te suffit de le remplacer par la saisie utilisateur, pis l'appel a MD5 et le sprintf cree une chaine de caractere qui contient le mot de passe chiffrer. Il rste a l'envoyer au serveur, sur celui ci de lire le mot de passe dans le fichier et tu fais l'appel a strcmp pour comparer les deux mots de passe

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    D'accord merci beaucoup à tout le monde

    RESOLU

  16. #16
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Peut on récupérer le md5.h quelque part pour l'utiliser sous windows ?
    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par SteelBox
    Peut on récupérer le md5.h quelque part pour l'utiliser sous windows ?
    Merci
    Encore une fois, 'md5.h' n'est qu'un fichier d'interface écrit pour une plateforme donnée.

    Pour utiliser MD5 sous Windows, il faut impérativement récupérer lla bibliothèque et le fichier d'entête qui on été conçu pour cette plateforme.

    Soit c'est quelque part dans l'API Windows (voir MSDN) soit c'est une bibliothèque tierce, et dans ce cas, google est ton ami.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Web 	Résultats 1 - 10 sur un total d'environ 79,100 pour md5 library windows. (0.54 secondes)
    Pas de Wi-Fi à la maison : CPL

  18. #18
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    j'ai voulu faire le meme systeme que toi sauf que ... mallheureusement ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    crypt.o(.text+0x20): In function `crypt_passwd':
    : undefined reference to `MD5'
    collect2: ld returned 1 exit status
    make: *** [all] Error 1
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <openssl/md5.h>
     
    int     crypt_passwd(char *passwd)
    {
      int           i;
      unsigned char md[MD5_DIGEST_LENGTH];
      MD5(passwd, strlen(passwd), md);
      for (i = 0; i < MD5_DIGEST_LENGTH; i++)
        printf("%02x", md[i]);
      return (0);
    }
    Je precise que je suis Sous linux et que j'ai bien les bonnes librairies.
    Mon md5.h existe

  19. #19
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    c bon j'ai trouver, il me manquai juste le -lssl dans les CFLAGS de mon makefile

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

Discussions similaires

  1. Crypter une chaine de caractère
    Par davels dans le forum Delphi
    Réponses: 14
    Dernier message: 28/05/2020, 13h34
  2. Comment crypter une chaine de caractères ?
    Par Seth77 dans le forum C#
    Réponses: 9
    Dernier message: 24/06/2008, 15h18
  3. crypter une chaine de caractère
    Par tiboo dans le forum C++
    Réponses: 27
    Dernier message: 08/03/2008, 17h49
  4. [C#] crypter une chaine de caractère
    Par FraktaL dans le forum Windows Forms
    Réponses: 4
    Dernier message: 30/08/2006, 20h23
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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