Wachtwoord generator

Status
Niet open voor verdere reacties.

amazigh90

Gebruiker
Lid geworden
15 feb 2013
Berichten
5
Ik ben bijna klaar met de generator maar heb een probleem met het verplaatsen van letters/cijfers. Dat doet mijn programma niet bij de gegenereerd ww.
Zie onderaan waar ik de tekst in het rood heb gezet daar gaat het verkeerd.
De code is als volgt:

Code:
  char[] hoofdLetters = "ZXCVBNMASDFGHJKLPOIUYTREWQ".ToCharArray();
			
			char[] cijfers = "1234567890".ToCharArray();
			
			char[] kleineLetters = "qwertyuiopasdfghjklzxcvbnm".ToCharArray();		
			
			Random randomGen = new Random();
			
			string kleine ="";
			string grote = "";
			string cijfer = "";
			string totaal = "";
						
			int aantalKleine;
			int aantalGrote;
			int aantalCijfers;
			
			try{
			aantalKleine = Convert.ToInt16(tbGenPassword.Text);
			aantalGrote = Convert.ToInt16(tbHoofdletters.Text);
			aantalCijfers = Convert.ToInt16(tbNumbers.Text);
			
			
			//kiest random kleine letters uit
			for (int i = 0; i < aantalKleine; i++) 
			{
				kleine += kleineLetters[randomGen.Next(0,26)];				
			}	
			
			for(int i = 0; i< aantalGrote; i++)
			{
				grote += hoofdLetters[randomGen.Next(0,26)];
			}
			
			for(int i = 0; i < aantalCijfers;i++)
			{
				cijfer += cijfers[randomGen.Next(0,10)];
			}
			
			totaal = kleine + grote+cijfer;
			
			
			[COLOR="#FF0000"]for(int i = 0; i < (aantalCijfers+aantalGrote+aantalKleine) ; i++)
			{
				totaal += totaal[randomGen.Next(0,(aantalCijfers+aantalGrote+aantalKleine))];
			}[/COLOR]
			
			tbGenPass.Text = totaal;
			
			
			
			}

Hier een foto van het programma zodat je begrijpt wat ik bedoel.

Generator.png
 
Laatst bewerkt door een moderator:
Wat voor wachtwoord wil je er uiteindelijk uit hebben? Ik zie nu basically 3 verschillende wachtwoorden die gegenereerd worden. Één met grote letters, één met kleine letters en één met cijfers.
 
Een wachtwoord die alle 3 kan hebben dus het ligt eraan wat je als cijfer invult bij de tekstvakken. Maar mijn probleem is dat ik nu dit krijg: aaAA11. Terwijl ik wil dat die dat mixt en er zoiets uitkomt: 1AaA1a. Dank je voor je snelle reactie :) Ik hoop dat je me hiermee kan helpen.
Btw ik ben net begonnen met programmeren dus ik ben er nog niet zo goed in.
 
Laatst bewerkt door een moderator:
Hetgeen je dus kan doen is 1 array met alle letters en cijfers erin.
Daaruit laat je dan random chars laat kiezen uit de volledige array.
Daar maakt je dan een wachtwoord mee.

Code:
char[] = "1234567890ZXCVBNMASDFGHJKLPOIUYTREWQqwertyuiopasdfghjklzxcvbnm".ToCharArray();

for(int i = 0, i < wachtwoordlengte, i++){
   //hier de code om een random char te kiezen.
}
//Result returnen naar de textbox.
 
Dat begrijp ik wel maar ik wil juist dat je zelf kunt kiezen hoeveel kleine letters, hoofdletters en cijfers je er in wilt hebben.
Als ik het doe zoals jij zegt dan kan ik zelf niet kiezen dus weet jij misschien hoe ik het alsnog werkende kan krijgen?
 
Laatst bewerkt door een moderator:
@amazigh90 Onnodige quotes verwijderd. Wanneer je direct reageert op een reactie is het niet nodig om dat bericht te quoten. Onnodig quoten heet dat, hetgeen niet gewenst is.
 
Dat begrijp ik wel maar ik wil juist dat je zelf kunt kiezen hoeveel kleine letters, hoofdletters en cijfers je er in wilt hebben.
Als ik het doe zoals jij zegt dan kan ik zelf niet kiezen dus weet jij misschien hoe ik het alsnog werkende kan krijgen?

Dat kan ook. Moet je denken aan zoiets (niet getest):

[CPP]const int lCase=2; const int uCase=2; const int cijf=2;
char[] chars = "1234567890ZXCVBNMASDFGHJKLPOIUYTREWQqwertyuiopasdfghjklzxcvbnm".ToCharArray();
string retVal;
for(int i = 0; i < lCase; i++){
//hier de code om een random char tussen char[36] en char[61] kiezen.
}
for(int i = 0; i < uCase; i++){
//hier de code om een random char tussen char[9] en char[35] kiezen.
}
for(int i = 0; i < uCase; i++){
//hier de code om een random char tussen char[0] en char[8] kiezen.
}
//Result returnen
return retVal;[/CPP]
 
Laatst bewerkt:
@ killermenace De shuffle methode werkt helaas niet doordat hij aangeeft dat de string totaal readonly is.

@ JoZ1 Dank je wel. Ik zal het even proberen of het op die manier wel wil werken.

Heb het net getest maar ik heb dan hetzelfde probleem als dat ik met mijn eigen code heb helaas.
 
Laatst bewerkt:
Heb even wat in een class gezet.

Code:
using System;
using System.Text.RegularExpressions;

namespace PasswordGenerator
{
    public class PasswordGenerator
    {
        private readonly string[] _digits = "0,1,2,3,4,5,6,7,8,9".Split(',');
        private readonly string[] _chars = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z".Split(',');
        private readonly Random _rnd;

        public PasswordGenerator()
        {
            _rnd = new Random();
            MinimumDigits = 3;
            MinimumLowerCase = 3;
            MinimumUppercase = 3;
            PasswordLength = 16;
        }

        public int MinimumDigits { get; set; }
        public int MinimumLowerCase { get; set; }
        public int MinimumUppercase { get; set; }
        public int PasswordLength { get; set; }

        public string GeneratePassword()
        {
            if (PasswordLength < MinimumDigits + MinimumLowerCase + MinimumUppercase)
                throw new Exception("there are more requirements set than the password length supports");

            var generatedPassword = string.Empty;
            while (generatedPassword.Length < PasswordLength)
            {
                switch (_rnd.Next(3))
                {
                    case 0: //add digit
                        generatedPassword += _digits[_rnd.Next(_digits.Length)];
                        break;
                    case 1: //add lowercase char
                        generatedPassword += _chars[_rnd.Next(_chars.Length)].ToLower();
                        break;
                    case 2: //add uppercase char
                        generatedPassword += _chars[_rnd.Next(_chars.Length)].ToUpper();
                        break;
                }
            }

            if (ValidatePassword(generatedPassword))
                return generatedPassword;

            return GeneratePassword();
        }

        private bool ValidatePassword(string password)
        {
            //add whatever requirements you want for your password
            if (password.Length - Regex.Replace(password, "[0-9]", "").Length < MinimumDigits)
                return false;

            if (password.Length - Regex.Replace(password, "[A-Z]", "").Length < MinimumUppercase)
                return false;

            if (password.Length - Regex.Replace(password, "[a-z]", "").Length < MinimumLowerCase)
                return false;

            return true;
        }
    }
}

Te gebruiken als bijvoorbeeld zo (min requirements kun je ook als property aanpassen etc):

Code:
var generator = new PasswordGenerator();
generator.PasswordLength = 16;
var password = generator.GeneratePassword();
 
Heb het net getest maar ik heb dan hetzelfde probleem als dat ik met mijn eigen code heb helaas.
Ah, natuurlijk; ik reageerde alleen op het citaat dat je ziet in mijn post. ;)

Zoiets dan:

[CPP]Console.WriteLine(shuffle(Wachtwoord(2,2,2).ToCharArray()));[/CPP]

[cpp]public static string Wachtwoord(int lCase, int uCase, int cijf)
{
char[] chars = "1234567890ZXCVBNMASDFGHJKLPOIUYTREWQqwertyuiopasdfghjklzxcvbnm".ToCharArray();
string retVal = string.Empty;
Random random = new Random();
for(int i = 0; i < lCase; i++){
retVal += chars[random.Next(36,62)];
}
for(int i = 0; i < uCase; i++){
retVal += chars[random.Next(9,36)];
}
for(int i = 0; i < cijf; i++){
retVal += chars[random.Next(0, 9)];
}
return retVal;
}


public static string shuffle(char[] input)
{
Random random = new Random();
for (int i = input.Length; i > 1; i--)
{
int j = random.Next(i);
char tmp = input[j];
input[j] = input[i - 1];
input[i - 1] = tmp;
}
return new string(input);
}[/cpp]

Gebruikmakend van de Fisher-Yates shuffle.
 
Dank jullie allemaal voor jullie reacties.
Het is uiteindelijk gelukt met behulp van iemand wie ik ken.

topic mag gesloten worden
 
En je had tussendoor niet meer de behoefte om dat even te laten weten?

Vraag opgelost zetten: in je eerste post rechtsonderin -> klik 'Zet status opgelost'
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan