Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: salasana generaattori

Sivun loppuun

tomageeni [20.10.2002 16:58:29]

#

Tämmönen 15 minuutin tekele, passugeneraattori. Heittää siis satunnaisia salasanoja jotka sisältävät isoja ja pieniä kirjaimia ja useimmiten myös numeroita.
Kieli on c++ kääntyy ainakin gcc:llä ja varmaan kaikilla muillakin c++ kääntäjillä.

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <string>

using namespace std;

int main()
{
  string passu;
  srand(time(0));
  int luku, a, b, c = 8;  // c muuttujan arvo == salasanan pituus
  for(a = 0; a < c; a ++)
  {
    b = rand() % 10; // tämä arpoo minkälainen merkki laitetaan (iso/pieni kirjain, numero)
    if(b < 3)
    {
      passu[a] = '0' + rand() % 9;
    }
    if(b > 2 && b < 7)
    {
      passu[a] = 'a' + rand() % 26;
    }
    if(b > 6)
    {
      passu[a] = 'A' + rand() % 26;
    }
    cout << passu[a];
  }
  return 0;
}

progo [22.10.2002 14:54:25]

#

Koskapa tuo ei ole kovin suuri tekele, tuon olisi voinut laittaa using namespace std;-rivin tuohon. Ei olisi tarvinnut noita erillisiä usingeja.

(nimetön) [11.01.2003 10:20:08]

#

jaksaako kukaan selitää aloittelijalle mitä alla oleva koodi tekee:

    b = rand() % 10; // tämä arpoo minkälainen merkki laitetaan (iso/pieni kirjain, numero)
    if(b < 3)
    {
      passu[a] = '0' + rand() % 9;
    }
    if(b > 2 && b < 7)
    {
      passu[a] = 'a' + rand() % 26;
    }
    if(b > 6)
    {
      passu[a] = 'A' + rand() % 26;
    }
    cout << passu[a];

tomaattigeeni [01.02.2003 18:46:22]

#

s_m_s:
b:n arvoksi tulee siis satunnaisluku 0-9.
Jos b on vähemmän kuin 3, merkkijonoon 'passu' arvotaan nykyisen pointterin kohdalle numero 0-9.
jos b on 3-6 niin arvotaan pieni kirjain väliltä a-z ja jos b on 7-9 arvotaan iso kirjain väliltä A-Z pointteriin.

nikke [19.01.2004 22:23:11]

#

Tuosta using jutusta että eihän tuo käytä ciniä eikä endliä, että periaatteessa pari turhaa riviä... Mutta ainahan marisijoita riittää! Näppärä ohjelma! Mulle tuo tapa lisätä satunnainen merkki oli uutta.

kanttu [19.01.2005 00:37:48]

#

No ensinnäkin salasanageneraattori on yhdyssana :)
Tämänkin olisi voinut toteuttaa ehkä vähän toisin.
rivillä: passu[a] = '0' + rand() % 9; on ilmeisesti pieni bugi, rand()%9 palauttaa luvut 0 - 8 jolloin merkkiä '9' ei koskaan tulla saamaan mukaan generoitavaan salasanaan. Muutenkin todennäköisyyksien valinta numeroilla, pienille ja kirjaimille on hieman outo, todennäköisyydet menevät nyt suhteessa 3 : 4 : 3 ... haluamme varmaan mahdollisimman satunnaisia salasanoja, joten paremmat suhteet saattaisi tulla käyttämällä kirjainten ja numeroiden määrää suhteena, tyyliin 10 : 26 : 26 tai supistettuna 5 : 13 : 13 :)

kanttu [19.01.2005 00:40:21]

#

Tein vastaavan version pure C:llä hieman erillaista lähestymistapaa käyttäen. Ohjelma ottaa nyt parametrinään generoitavan salasanan pituuden merkkeinä.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main( int argc, char* argv[] )
{
        if( argc < 2 )
        {
                return -1;
        }

        const char charTable[] = "abcdefghijklmnopqrstuvwzyxABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        const unsigned int charTableLen = strlen( charTable );

        int n = atoi( argv[1] );

        srand( time( 0 ) );

        while( n-- )
        {
                putchar( charTable[ rand()%charTableLen ] );
        }

        putchar( '\n' );

        return 0;
}

kanttu [19.01.2005 00:43:47]

#

Tabulaattorit eivät näköjään toimi, kuitenkin tässä versiossa kaikki merkit on laitettu erilliseen taulukkoon, siihen voi nyt myös lisätä erikoismerkkejä, jos siltä tuntuu. strlen laskee taulukon pituuden joka tässä tapauksessa on 10+26+26=64. atoi muuttaa argumentin [1] joka on ohjelmalle syötetty parametri, kokonaisluvuksi. Tätä lukua käytetään kertomaan kuinka pitkä salasanasta kuuluisi tulla.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta