C :: Aufgabe #63

2 Lösungen Lösungen öffentlich

Passwortgenerator mit Parametern

Anfänger - C von pocki - 27.11.2014 um 18:11 Uhr
Erstelle ein Programm/Funktion welche/s ein zufälliges Passwort erzeugt.
Als Parameter soll die Länge sowie die Art der darin vorkommenden Zeichen übergeben werden können.
Zur Auswahl sollen stehen: Kleinbuchstaben, Großbuchstaben, Zahlen und Sonderzeichen.
Jede beliebige Kombination der Parameter soll möglich sein.

Lösungen:

vote_ok
von devnull (8870 Punkte) - 27.12.2014 um 11:14 Uhr
Das Programm wird über Kommandozeilenparameter bedient.
Defaulteinstellungen sind Passwortlänge = 8 und Kleinbuchstaben.
Beispiele:

Konsolenausgabe:


$ ./pwgen -h
Usage: pwgen [-aAns] [Länge]
-a : Kleinbuchstaben
-A : Großbuchstaben
-n : Ziffern
-s : Sonderzeichen
Länge : Passwortlänge (Default 8)

$ ./pwgen
qdhgtogp

$ ./pwgen -aAn 12
W4kCagPYeVB5

$ ./pwgen -aAns 16
F5LSw^3P2[p+1X!n


Quellcode ausblenden C-Code
/********************************************
 * pwgen.c    password generator
 ********************************************/
#include <unistd.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <ctype.h>
#include <time.h>

#define MAX_LETTERS ('Z'-'A'+1)
#define MAX_NUMBERS ('9'-'0'+1)
#define MIN_PWLEN 5
#define DEF_PWLEN 8
#define MAX_PWLEN 255

short special_chars[] = {33,35,36,37,38,42,43,45,46,47,\
                         58,59,61,63,91,92,93,94,95,126};
int max_special = sizeof(special_chars) / sizeof(short);

bool opt_lower = false;
bool opt_upper = false;
bool opt_digit = false;
bool opt_special = false;

/*** functions ***/
// usage
void usage_exit(int exit_code) {
  printf(
"Usage: pwgen [-aAns] [Länge]\n"
"       -a : Kleinbuchstaben\n"
"       -A : Großbuchstaben\n"
"       -n : Ziffern\n"
"       -s : Sonderzeichen\n"
"    Länge : Passwortlänge (Default %d)\n", DEF_PWLEN);
  exit(exit_code);
}

// prepare password character set
// returns number of characters in set
int set_pwchars(char *charset) {
	int c, p;
	
    p = 0;
	if (opt_lower)
		for (c='a'; c<='z'; c++,p++)
			charset[p] = c;	
	if (opt_upper)
		for (c='A'; c<='Z'; c++,p++)
			charset[p] = c;	
	if (opt_digit) {
		for (c='0'; c<='9'; c++,p++)
			charset[p] = charset[p+MAX_NUMBERS] = c;
		p += MAX_NUMBERS;
	}
	if (opt_special)
		for (c=0; c<max_special; c++,p++)
			charset[p] = special_chars[c];
	return p;
}

// generate password
// returns pointer to password string
//  pwchars: password character set (array)
//    pwmax: length of character set
//    pwlen: length of password string
char *gen_password(char *pwchars, int pwmax, int pwlen) {
	static char passwrd[MAX_PWLEN+1];
	int clower, cupper;
	int cdigit, cspecial;
	int c, p;
	bool pwok = false;
	
	// generate PW
    if (pwlen < MIN_PWLEN) pwlen = MIN_PWLEN;
    if (pwlen > MAX_PWLEN) pwlen = MAX_PWLEN;
    
	while (!pwok) {
		clower = cupper = cdigit = cspecial = 0;
		srandom(time(NULL));
		// fill array with random characters
		for (p=0; p<pwlen; p++) {
			c = pwchars[ (random() * pwmax/RAND_MAX) ];
			if (islower(c)) 
				clower++;
			else if (isupper(c)) 
				cupper++;
			else if (isdigit(c))
				cdigit++;
			else
				cspecial++;
			passwrd[p] = c;
		}
		// check password characters
		if ((opt_lower && clower == 0) ||
		    (opt_upper && cupper == 0) ||
		    (opt_digit && cdigit == 0) ||
		    (opt_special && cspecial == 0))
				continue;
		pwok = true;			
	}
	passwrd[pwlen] = '\0';
	return passwrd;
}

/*** main ***/
int main(int argc, char **argv) {
	char pwch[2*(MAX_LETTERS + MAX_NUMBERS) + max_special];
	int opt, pwlen;

    // get password options [-aAns] [length]
    while ((opt = getopt( argc, argv, "aAnsh" )) != -1) {
      switch(opt) {
          case 'a': opt_lower = true; break;
          case 'A': opt_upper = true; break;
          case 'n': opt_digit = true; break;
          case 's': opt_special = true;	break;
          case 'h': usage_exit(EXIT_SUCCESS); break;
          default : usage_exit(EXIT_FAILURE);
      }
    }
    pwlen = (argc-optind > 0) ? atoi(argv[optind]) : DEF_PWLEN;
	if ((opt_lower | opt_upper | opt_digit | opt_special) == 0)
		opt_lower = true;

	printf("%s\n", gen_password(pwch, set_pwchars(pwch), pwlen));
	return 0;
}		
vote_ok
von kathleenw (3600 Punkte) - 15.07.2020 um 11:34 Uhr
Quellcode ausblenden C-Code
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>

int zufallszahl(int min, int max)
{
    int zahl;
    zahl= (rand()%((max+1)-min))+min;
    return zahl;
}

int main(void)
{
    //Deklarationen
    int laengePasswort, zufall, i;
    bool kleineBuchstaben, grosseBuchstaben, zahlen, sonderzeichen;
    char antwort[2];
    
    //Initialsierungen
    i=0;
    srand(time(NULL));
    
    printf("***************************************\n");
    printf("********** Passwortgenerator **********\n");
    printf("***************************************\n\n");
    printf("Wie lang soll das Passwort sein? ");
    if (scanf("%d", &laengePasswort)!=1) {
        printf("Sie müssen eine Zahl eingeben!");
        return EXIT_FAILURE;
    }
    
    char passwort[laengePasswort];

    printf("Soll das Passwort kleine Buchstaben enthalten? (j/n)");
    fgets(antwort,2,stdin);
    if (fgets(antwort,2,stdin)==NULL) {
        printf("Fehler bei der Eingabe!\n");
        return EXIT_FAILURE;
    }
    else {
        if (antwort[0] == 'j') {
            kleineBuchstaben = true;
        }
        else if (antwort[0] == 'n') {
            kleineBuchstaben = false;
        }
        else {
            printf("Sie dürfen nur ja(j) oder nein(n) eingeben!\n");
            return EXIT_FAILURE;
        }
    }
    printf("Soll das Passwort große Buchstaben enthalten? (j/n)");
    fgets(antwort,2,stdin);
    if (fgets(antwort,2,stdin)==NULL) {
        printf("Fehler bei der Eingabe!\n");
        return EXIT_FAILURE;
    }
    else {
        if (antwort[0] == 'j') {
            grosseBuchstaben = true;
        }
        else if (antwort[0] == 'n') {
            grosseBuchstaben = false;
        }
        else {
            printf("Sie dürfen nur ja(j) oder nein(n) eingeben!\n");
            return EXIT_FAILURE;
        }
    }
    printf("Soll das Passwort Zahlen enthalten? (j/n)");
    fgets(antwort,2,stdin);
    if (fgets(antwort,2,stdin)==NULL) {
        printf("Fehler bei der Eingabe!\n");
        return EXIT_FAILURE;
    }
    else {
        if (antwort[0] == 'j') {
            zahlen = true;
        }
        else if (antwort[0] == 'n') {
            zahlen = false;
        }
        else {
            printf("Sie dürfen nur ja(j) oder nein(n) eingeben!\n");
            return EXIT_FAILURE;
        }
    }
    printf("Soll das Passwort Sonderzeichen enthalten? (j/n)");
    fgets(antwort,2,stdin);
    if (fgets(antwort,2,stdin)==NULL) {
        printf("Fehler bei der Eingabe!\n");
        return EXIT_FAILURE;
    }
    else {
        if (antwort[0] == 'j') {
            sonderzeichen = true;
        }
        else if (antwort[0] == 'n') {
            sonderzeichen = false;
        }
        else {
            printf("Sie dürfen nur ja(j) oder nein(n) eingeben!\n");
            return EXIT_FAILURE;
        }
    }
    
    //Passwort erzeugen
    if (kleineBuchstaben==false && grosseBuchstaben==false && zahlen == false && sonderzeichen ==false) {
        printf("Sie müssen zumindest eine Art von Zeichen für das Passwort zulassen.\n");
    }
    else {
        do {
            zufall = zufallszahl(33, 126);
            if (kleineBuchstaben == true && zufall>=97 && zufall<=122) {
                passwort[i] = (char)zufall;
                i++;
            }
            else if (grosseBuchstaben == true && zufall>=65 && zufall<=90) {
                passwort[i] = (char)zufall;
                i++;
            }
            else if (zahlen == true && zufall>=48 && zufall<=57) {
                passwort[i] = (char)zufall;
                i++;
            }
            else if ((sonderzeichen == true) && ((zufall>=33 && zufall<=47) || (zufall>=58 && zufall<=64) || (zufall>=91 && zufall<=96) || (zufall>=123 && zufall<=126))) {
                passwort[i] = (char)zufall;
                i++;
            }
                
        }while(i<laengePasswort);
        
        //Ausgabe
        
        printf("\nDies ist ihr Passwort: ");
        for(i=0;i<laengePasswort;i++) {
            printf("%c",passwort[i]);
        }
        printf("\n\n");
    }
    return EXIT_SUCCESS;
}