C :: Aufgabe #63
2 Lösungen
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.
Lösungen:
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;
}
#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;
}
