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 :

Fonction crypt(3) dans unix


Sujet :

C

  1. #1
    elm
    elm est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 20
    Par défaut Fonction crypt(3) dans unix
    Bonjour,
    Toujours dans le cadre d'un projet de cours, je dois utiliser la fonction crypt(3) dans un programme pour retrouver un mot de passe par force brute.

    Après tests, je n'arrive pas à utiliser cette fonction. Le compilateur me renvoie un

    warning: implicit declaration of function 'crypt'

    J'ai pourtant inclus <unistd.h> dans mon header. Je ne comprends pas la signification de: #define _XOPEN_SOURCE mais je l'ai inclus aussi, mais rien n'y fait. Faut-il installer quelque chose de spécial pour pouvoir utiliser cette fonction malgré le fait qu'elle aparaisse dans les manpages?

    Merci de me guider (une fois de plus sur cet excellent forum).

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Pourrait on voir l'appel de la fonction?

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    As-tu ajouté la constante:
    au début de ton fichier ?


    Voir: http://man.developpez.com/man3/crypt.3.php
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    elm
    elm est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 20
    Par défaut
    Citation Envoyé par Franck.H
    As-tu ajouté la constante:
    au début de ton fichier ?


    Voir: http://man.developpez.com/man3/crypt.3.php
    Je l'ai rajouté dans mon header.
    Mon appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	mycrypt = crypt(mycur, r->salt);
    où mycrypt, mycur et r->salt sont des pointeurs alloués vers des chaînes de caractères .

    Voici les erreurs renvoyées (avec -Wall -Werror):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    research.c:9: warning: implicit declaration of function `crypt'
    research.c:9: warning: assignment makes pointer from integer without a cast
    La deuxième erreur est aussi étrange, j'ai alloué mycrypt d'une taille de 14*sizeof(Char), ma fonction étant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int search(res *r, char *mycur, char *mycrypt);
    Je ne comprends pas non plus ce Warning...

  5. #5
    Membre confirmé Avatar de Beldom
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 63
    Par défaut
    Après lecture du Man, il me semble que tu n'as pas besoin d'allouer mycrypt.
    crypt(3) te renvoie directement un pointeur sur mot de passe crypté.

    Ensuite, ton second warning viens du premier. Comme il y a un problème (normalement d'include...), crypt est considérée comme renvoyant un int par le compilateur. Automatiquement, il y a un problème detecté, puisque tu récupère en réalité un pointeur sur une chaine de caractère.

    Ce problème est typique d'un mauvais include...
    As-tu essayé d'ouvrir unistd.h et d'y rechercher crypt ?
    S'il y a bien un prototype de la fonction, relis tes includes, cherche une faute de frappe... S'il n'y est pas... C'est de là que viens le problème.

    Mais comme ca, je peux pas en dire plus.

  6. #6
    elm
    elm est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 20
    Par défaut
    J'ai cherché dans unistd et apparemment elle s'y trouve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /* XPG4.2 specifies that prototypes for the encryption functions must
       be defined here.  */
    #ifdef	__USE_XOPEN
    /* Encrypt at most 8 characters from KEY using salt to perturb DES.  */
    extern char *crypt (__const char *__key, __const char *__salt)
         __THROW __nonnull ((1, 2));
    J'ai essayé un simple test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #define _XOPEN_SOURCE_
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
     
     
    int main(int argc, char *argv[]){
    	char b[8] = { 'B', 'o', 'n', 'j', 'o', 'u', 'r', '\0' };
    	char s[3] = { '1', '1', '\0' };
    	crypt(b,s);
    }
    Et j'ai toujours un message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /tmp/ccyvlaiW.o(.text+0x54): In function `main':
    : undefined reference to `crypt'
    collect2: ld returned 1 exit status
    Merci pour votre aide.

  7. #7
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    La page de manuel est tout de meme assez claire:
    Citation Envoyé par man 3 crypt
    SYNOPSIS
    #define _XOPEN_SOURCE
    #include <unistd.h>

    char *crypt(const char *key, const char *salt);
    et, plus loin,
    Citation Envoyé par man 3 crypt
    Programs using this function must be linked with -lcrypt.

  8. #8
    elm
    elm est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 20
    Par défaut
    En effet, pour le fichier test, j'avais oublié d'ajouter les -lcrypt.
    Dans mon programme par contre, il est dans mon makefile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CC = gcc
    CFLAGS = -Wall -Werror
    LFLAGS = -lpthread -lcrypt -lposix4 
    OBJETS = main.o read.o process.o thread.o research.o
     
    main: $(OBJETS)
    	$(CC) $(CFLAGS) -o pw $(OBJETS) $(LFLAGS)
     
    clean:
    	rm *.o pw
    Et j'ai toujours la même erreur.

  9. #9
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par elm
    Et j'ai toujours la même erreur.
    Laquelle, l'erreur d'edition de lien ?
    Sinon, compiles-tu le fichier source qui utilise crypt() avec _XOPEN_SOURCE comme indique (et pas _XOPEN_SOURCE_, attention)?
    Ton Makefile ne montre pas la creation des fichiers objet, mais celui qui utilise crypt() devrait etre compile avec un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    myfile.o: myfile.c
            $(CC) -c $(CFLAGS) -D_XOPEN_SOURCE $<

  10. #10
    elm
    elm est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 20
    Par défaut
    Merci Dazumba! En effet, j'avais mis _XOPEN_SOURCE_ comme indiqué dans les manpages online, et non _XOPEN_SOURCE, je n'avais pas remarqué la différence... Cette différence est-elle due à des modifications ou simplement une erreur de recopiage qui s'est propagée?

    Je n'ai rien dû changer au Makefile.

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

Discussions similaires

  1. Fonction system() avec commandes unix dans boucle
    Par vaderetro33 dans le forum C
    Réponses: 21
    Dernier message: 07/10/2009, 10h33
  2. fonction équivalente à la fonction MOD (oracle) dans ms-sql
    Par rodrigue50 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/07/2005, 16h14
  3. Réponses: 5
    Dernier message: 06/05/2005, 19h10
  4. [C#] balise <a> en fonction d'infos dans l
    Par Pierrre dans le forum ASP.NET
    Réponses: 2
    Dernier message: 04/08/2004, 12h40
  5. Réponses: 12
    Dernier message: 14/06/2004, 13h06

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