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 :

Génération de mots de passe aléatoire dans un fichier texte


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Génération de mots de passe aléatoire dans un fichier texte
    Je souhaite réaliser un programme en C qui permet de demander la taille en caractère ainsi que le nombre de mot de passe à générer dans un fichier texte.

    -Je voudrait générer des mots de passes constitués de lettres majuscules,minuscules et de chiffres. Je pense qu'il faudra transformer pour cela des entiers en chaine de caractere, mais je ne suis pas sur.

    - Et je ne sais pas non plus comment faire pour que la taille des mots de passe soit celle définie par l'utilisateur du programme.

    Voilà ce que j'ai déjà 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include<stdlib.h>
    #include<stdio.h>
    #include<time.h>
     
    void main()
    {
     
    	int taille,nb,i,random;
    	char nomf[20];
     
    	FILE * f;
     
    	srand((int)time(NULL));
    	int mdp_aleatoire;
     
    	printf("donner le nom du fichier \n");
    	scanf("%s",&nomf);
    	f=fopen(nomf,"w");
     
    	printf("Donner la taille en caractère des mots de passe. \n");
    	scanf("%d",&taille);
     
    	printf("Donner le nombre de mots de passe à générer. \n");
    	scanf("%d",&nb);
     
    	for(i=0;i<=nb;i++)
    	{
    		random=rand()%255;
    		mdp_aleatoire=random;
     
    		fprintf(f,"%d",mdp_aleatoire);
     
     
    	}
    	system("pause");
    }

  2. #2
    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 irbah24 Voir le message
    Voilà ce que j'ai déjà fait :
    Déjà, tu devrais corriger ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:6: warning: function declaration isn't a prototype
    main.c:6: warning: return type of 'main' is not `int'
    main.c: In function `main':
    main.c:17: warning: char format, different type arg (arg 2)
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 3 warnings
    Si ton compilateur ne dit rien, il faut mieux le configurer :

    http://emmanuel-delahaye.developpez....tm#cfg_compilo
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Je vous remercie pour votre conseil, mais j'utilise Visual C++ 6.0 et je ne sais pas quels sont les modifications à apporter. J'ai finalement réussi, après quelques tatonnements, à réaliser le programme que voici :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include<stdlib.h>
    #include<stdio.h>
    #include<malloc.h>
     
    void main()
    {
    	char *tab;
    	char nomf[20];
    	int nb,i,j,taille;
    	FILE * f;
    	char const s[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
     
    	printf("donner le nom du fichier \n");
    	scanf("%s",&nomf);
    	f=fopen(nomf,"w");
     
    	printf("Donner la taille en caractère des mots de passe.");
    	scanf("%d",&taille);
     
    	printf("Donner le nombre de mots de passe à générer. \n");
    	scanf("%d",&nb);
     
    	tab=(char*)malloc(sizeof(char)*taille);
     
    	fprintf(f,"  ****************** \n");
    	fprintf(f,"  * MOTS DE PASSES * \n");
    	fprintf(f,"  ****************** \n");
    	printf("\n");
     
    	for(i=0;i<=(nb-1);i++)
    	{
    		for(j=0;j<taille;j++)
    		{
    			tab[j] = s[rand()%(sizeof s)];
    			fprintf(f,"%c",tab[j]);
     
    		}
    		fprintf(f,"\n");
    		fprintf(f,"\n");
    	}
     
    		free(tab);
     
    		system("pause");
     
    }

  4. #4
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Bonjour,

    il manque le fclose du fichier il me semble.
    De plus pour donner un peu plus de caractere aléatoire a rand, on l'initialise avec la fonction srand().

    Un exemple est dans la FAQ du site, avec l'explication du pourquoi du comment je crois, sinon dans le man (du site egalement).
    "vaste programme"

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par irbah24 Voir le message
    Je vous remercie pour votre conseil, mais j'utilise Visual C++ 6.0 et je ne sais pas quels sont les modifications à apporter. J'ai finalement réussi, après quelques tatonnements, à réaliser le programme que voici :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include<stdlib.h>
    #include<stdio.h>
    #include<malloc.h>
     
    void main()
    {
    	char *tab;
    	char nomf[20];
    	int nb,i,j,taille;
    	FILE * f;
    	char const s[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
     
    	printf("donner le nom du fichier \n");
    	scanf("%s",&nomf);
    	f=fopen(nomf,"w");
     
    	printf("Donner la taille en caractère des mots de passe.");
    	scanf("%d",&taille);
     
    	printf("Donner le nombre de mots de passe à générer. \n");
    	scanf("%d",&nb);
     
    	tab=(char*)malloc(sizeof(char)*taille);
     
    	fprintf(f,"  ****************** \n");
    	fprintf(f,"  * MOTS DE PASSES * \n");
    	fprintf(f,"  ****************** \n");
    	printf("\n");
     
    	for(i=0;i<=(nb-1);i++)
    	{
    		for(j=0;j<taille;j++)
    		{
    			tab[j] = s[rand()%(sizeof s)];
    			fprintf(f,"%c",tab[j]);
     
    		}
    		fprintf(f,"\n");
    		fprintf(f,"\n");
    	}
     
    		free(tab);
     
    		system("pause");
     
    }
    Quelques remarques en vrac:

    • malloc.h n'est pas standard. stdlib.h suffit
    • main() retourne un entier de type int, toujours! Par convention, main() retourne 0 ou EXIT_SUCCESS en cas d'exécution avec succès.
    • scanf("%s", ...) est une des pires utilisation de scanf() qu'on puisse imaginer.
    • C'est pas scanf("%s", &nomf); main scanf("%s", nomf). Je déconseille l'usage de scanf(). Je préfère fgets() éventuellement couplée à sscanf() ou strtol(), strtoul(), strtod(). Une recherche sur le forum devrait t'en apprendre plus su la manière de réaliser des saisies sécurisées en C.
    • Il faut toujours vérifier la valeur retournée par fopen().
    • Le cast de la valeur retournée par malloc n'est pas nécessaire. Il est même déconseillé.
    • Je préfère tab = malloc(taille * sizeof *tab);
    • Il faut toujours vérifier la valeur retournée par malloc()
    • Je ne vois pas d'appel à fclose()
    • system("pause") est inutile sur les EDIs modernes


    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    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 irbah24 Voir le message
    Je vous remercie pour votre conseil, mais j'utilise Visual C++ 6.0 et je ne sais pas quels sont les modifications à apporter. J'ai finalement réussi, après quelques tatonnements, à réaliser le programme que voici :
    Ton code corrigé et commenté :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    #include<stdlib.h>
    #include<stdio.h>
    /* -ed- pas standard et inutile.
    #include<malloc.h>
    */
    #include<string.h>
     
    #define TAB 0
    #define DBG 1
     
    static char const s[] =
       "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
     
    /* -ed-
    void main()
     
    main() retourne int. Toujours.
    */
    int main (void)
    {
       /* -ed-
     
          char nomf[20];
          char *tab;
          int nb, i, j, taille;
          FILE *f;
          char const s[] =
          "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
     
          Il est inutile, voire nuisible, de centraliser les variables. */
     
       char nomf[20];
     
       printf ("donner le nom du fichier \n");
    /* -ed-
       scanf ("%s", &nomf);
     
       "%s" attend une l'adresse de type char *. Lorsqu'un tableau est
       passé en parametre, il est converti en un pointeur sur le premier
       element de ce tableau. Le & est donc inutie (et n'est pas du bon type)
    */
       scanf ("%s", nomf);
       {
          FILE *f = fopen (nomf, "w");
          /* -ed- une ouverture de fichier peut echoier (NULL) */
          if (f != NULL)
          {
             int taille;
             int nb;
     
    /* -ed- ajoute '\n' */
             printf ("Donner la taille en caracteres des mots de passe.\n");
             scanf ("%d", &taille);
     
             printf ("Donner le nombre de mots de passe à générer. \n");
             scanf ("%d", &nb);
    /* -ed-
       tab = (char *) malloc (sizeof (char) * taille);
     
      le cast est inutile, voire nuisible.
      sizeof (char) vaut 1 par définition
      La forme sizeof *p * n est preferable.
     
      malloc() peut echouer. Il manque un test (NULL)
     
      Apres reflexion, le tableau de sert a rien. Suppression.
    */
             {
    #if TAB
                char *tab = malloc (sizeof *tab * taille);
                if (tab != NULL)
                {
    #endif
                   fprintf (f, "  ****************** \n");
                   fprintf (f, "  * MOTS DE PASSES * \n");
                   fprintf (f, "  ****************** \n");
                   printf ("\n");
                   {
                      int i;
    /* -ed-
                      for (i = 0; i <= (nb - 1); i++)
     
                      ce genre d'expression me donne mal a la tete.
                      l'expression canonique est
    */
                      for (i = 0; i < nb; i++)
                      {
                         int j;
                         for (j = 0; j < taille; j++)
                         {
    #if TAB
                            tab[j] = s[rand () % (sizeof s)];
                            fprintf (f, "%c", tab[j]);
    #else
    /* -ed- Bonne methode.
    Attention a ne pas deborder du tableau.
    sizeof prend le 0 final (hors-sujet).
    */
                            int c = s[rand () % (sizeof s - 1)];
                            fprintf (f, "%c", c);
    #endif
                         }
                         fprintf (f, "\n\n");
                      }
                   }
    #if TAB
                   free (tab), tab = NULL;
                }
    #endif
             }
    /* -ed- le fichier doit etre ferme proprement. */
             fclose (f), f = NULL;
     
    #if DBG
             {
                char cde[256] = "type ";
                strcat (cde, nomf);
                system (cde);
             }
    #endif
     
          }
       }
    /* -ed- probablement inutile
       system ("pause");
    */
     
       /* -ed- parce que main() retourne un int, donner une valeur valide.
          0 signifie OK */
       return 0;
    }
    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
    18
    19
    20
    21
    22
    23
    24
    25
     
    donner le nom du fichier
    xxx
    Donner la taille en caracteres des mots de passe.
    8
    Donner le nombre de mots de passe Ó gÚnÚrer.
    6
     
      ******************
      * MOTS DE PASSES *
      ******************
    frAQBc8W
     
    sa1xVPfv
     
    JcrgRYwT
     
    iizs2trQ
     
    F69AzBla
     
    x3CF3EDN
     
     
    Press ENTER to continue.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ca fait quand même pas mal de choses à revoir. Il me reste beaucoup de chemin à parcourir avant de pouvoir éviter toutes ces erreurs (dont certaines auraient pu être évitées avec un peu plus d'attention...).
    Merci pour vos réponses.

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

Discussions similaires

  1. Lignes Aléatoires dans un fichier texte
    Par bob456 dans le forum C#
    Réponses: 6
    Dernier message: 06/11/2010, 15h47
  2. Chercher une ligne aléatoire dans un fichier texte
    Par pyopyo dans le forum Langage
    Réponses: 1
    Dernier message: 30/04/2008, 09h26
  3. [framework]génération de mot de passe aléatoire
    Par seb_fou dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 13/02/2006, 13h14
  4. [conseil] script de génération de mots de passe
    Par spilliaert dans le forum Langage
    Réponses: 11
    Dernier message: 07/02/2006, 20h10
  5. [9i] oublie mot de passe system dans console manager
    Par ostrycharz dans le forum Oracle
    Réponses: 2
    Dernier message: 04/02/2006, 18h39

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