C :: Aufgabe #63 :: Lösung #1
2 Lösungen
#63
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.
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.
#1
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:
C-Code
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
/********************************************
* 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;
}
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1
