C++ - Random Password Generator

C++ - Random Password Generator

Postby eni4ever » 14 Jul 2011, 17:06

Acest topic este un răspuns pe aceeași problemă postată de DarkByte aici.
Există 2 motive pentru care am realizat acest cod/mesaj :
  • Nu am un magnetism special pentru Delphi/Pascal, dar am considerat că ideea merită abordată și pentru muritorii ce știu C++ de pildă :)
  • Plângea subforumul după subiecte, brutelor! :))

Exemple wrote:GenereazaParola(6, "Aa##~~") => "6hC=3+"
GenereazaParola(6, "AAaa##") => "z2G1qK"
GenereazaParola(10, "AAAAAAAAAA") => "CNORFGPSVJ"
GenereazaParola(10, "#####") => "34=52t6Y78"
GenereazaParola(30) => "3DMU$yX5Km90sqt7Ah*O8l6?=JZnzR"


  1. #include <iostream>
  2. #include <algorithm>
  3. #include <ctime>
  4. #include <cstdlib>
  5.  
  6. using namespace std;
  7.  
  8. const char *multCarSpeciale = "*$-+?_&=!%{}/";
  9.  
  10. /*!
  11.     Alege, extrage si returneaza un caracter dintr-un anumit set de caractere.
  12.     \param mulCaracts Setul de caractere din care se va extrage, in mod aleator, un caracter. In urma extragerii, caracterul se elimina din set. Daca setul ajunge sa nu mai aiba caractere, el se reconstituie.
  13.     \param indexSet Indexul setului ales pentru extragere
  14.     \return Un caracter aleator din setul dorit
  15.  */
  16. char ExtrageCarAleator(string &mulCaracts, unsigned int indexSet)
  17. {
  18.     char carAles = ' ';
  19.     unsigned int indexCarAles = rand() % mulCaracts.length();
  20.  
  21.     //extragem caracterul generat
  22.     carAles = mulCaracts[indexCarAles];
  23.  
  24.     // eliminam caracterul extras din set si, daca este cazul, reconstituim setul
  25.     mulCaracts.erase(indexCarAles, 1);
  26.  
  27.     if(mulCaracts.empty())
  28.         switch(indexSet)
  29.         {
  30.         case 0:
  31.             mulCaracts = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  32.             break;
  33.         case 1:
  34.             mulCaracts = "abcdefghijklmnopqrstuvwxyz";
  35.             break;
  36.         case 2:
  37.             mulCaracts = "0123456789";
  38.             break;
  39.         case 3:
  40.             mulCaracts = multCarSpeciale;
  41.             break;
  42.         }
  43.  
  44.     return carAles;
  45. }
  46.  
  47. /*!
  48.     Construieste si returneaza un sir format aleator din elemente din 4 clase (cifre, litere (mici, mari), caractere speciale).
  49.     \param pLungime Lungimea sirului ce se doreste a fi returnat.
  50.     \param pFormat Specifica o constrangere a sirului rezultat. Prin constrangere se intelege o dorinta SIGURA de a avea, in sirul generat, anumite elemente din clase specifice. (implicit nu exista)
  51.     Constrangerile vin sub forma de caractere intr-un sir de caractere, fiecare avand urmatoarea interpretare :
  52.     - 'A' : se doreste ca in sirul rezultat sa existe cel putin o litera englezeasca \b MARE
  53.     - 'a' : se doreste ca in sirul rezultat sa existe cel putin o litera englezeasca \b mica
  54.     - '#' : se doreste ca in sirul rezultat sa existe cel putin o \b cifra
  55.     - '~' : se doreste ca in sirul rezultat sa existe cel putin un caracter \b special
  56.  
  57.     \return Sirul aleator generat tinand cont de eventualele constrangeri.
  58.  */
  59. string GenereazaParola(unsigned int pLungime,
  60.                        const string &pFormat = "")
  61. {
  62.     string pGenerata = "";
  63.     string setCaractere[] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz",
  64.                              "0123456789", multCarSpeciale
  65.                             };
  66.     unsigned int nrElemPrezente = 0;
  67.     unsigned int indexClsGenerata = 0;
  68.  
  69.     if(pFormat.length() <= pLungime)
  70.     {
  71.         // pornim sirul generat de la elementele tiparului sugerat alese din domeniul lor de apartenenta
  72.         for(nrElemPrezente = 0; nrElemPrezente < pFormat.length(); ++nrElemPrezente)
  73.         {
  74.             switch(pFormat[nrElemPrezente])
  75.             {
  76.             case 'A':
  77.                 // alegem si adaugam un caracter englezesc (litera MARE)
  78.                 pGenerata += ExtrageCarAleator(setCaractere[0], 0);
  79.                 break;
  80.             case 'a':
  81.                 // alegem si adaugam un caracter englezesc (litera mica)
  82.                 pGenerata += ExtrageCarAleator(setCaractere[1], 1);
  83.                 break;
  84.             case '#':
  85.                 // alegem si adaugam o cifra
  86.                 pGenerata += ExtrageCarAleator(setCaractere[2], 2);
  87.                 break;
  88.             case '~':
  89.                 // alegem si adaugam un caracter special
  90.                 pGenerata += ExtrageCarAleator(setCaractere[3], 3);
  91.                 break;
  92.             }
  93.         }
  94.  
  95.         // completam restul de elemente cu valori uniform alese din cele 4 clase impuse
  96.         while(nrElemPrezente++ < pLungime)
  97.         {
  98.             // alegem o valoare uniform distribuita pe intervalul [0, 4) si-i asociem un caracter
  99.             indexClsGenerata = rand() % 4;
  100.             pGenerata += ExtrageCarAleator(setCaractere[indexClsGenerata], indexClsGenerata);
  101.         }
  102.  
  103.         // amestecam elementele
  104.         random_shuffle(pGenerata.begin(), pGenerata.end());
  105.     }
  106.  
  107.     return pGenerata;
  108. }
  109.  
  110. int main()
  111. {
  112.     // initializam generatorul de numere pseudoaleatoare
  113.     srand(time(NULL));
  114.  
  115.     // doar cu titlu de prezentare, respectand restrictiile lui DB
  116.     cout << GenereazaParola(6, "Aa##~~");
  117.  
  118.     return 0;
  119. }


P.S: touche, Delphi lovers! :P


L.E. (-- 14 Jul 2011, 12:22 --)

O versiune imbunătățită care permite alegerea lungimii șirului generat dintr-un interval de valori [min, max) cu min <= max este prezentată mai jos.
Dacă max nu se specifică, atunci se ia valoarea implicită 50.

Exemplu wrote:GenereazaParola(6, "Aa##~~", 12) : /* alege un sir de lungime [6,12) care respecta contrangerea respectiva */
p*!67gN+
v/-&e87O2Y{
H?o3{1

GenereazaParola(6, "Aa##~~") : /* alege un sir de lungime [6,50) care respecta contrangerea respectiva */
?6G_Do185Nbj9Rs7{0-=&%mq4a}+32M!w*t
7*$ZH!3/m
1rWE/+NFu=hy*A3{-79&tGRIfT!2q6_85b0C
8/$4Bxk

GenereazaParola(6, "Aa##~~", 6) : /* alege un sir de lungime 6 care respecta contrangerea respectiva */
=Cz91!
_6v}4D
f8W{3?


  1. #include <iostream>
  2. #include <algorithm>
  3. #include <ctime>
  4. #include <cstdlib>
  5.  
  6. using namespace std;
  7.  
  8. const char *multCarSpeciale = "*$-+?_&=!%{}/";
  9.  
  10. /*!
  11.     Alege, extrage si returneaza un caracter dintr-un anumit set de caractere.
  12.     \param mulCaracts Setul de caractere din care se va extrage, in mod aleator, un caracter. In urma extragerii, caracterul se elimina din set. Daca setul ajunge sa nu mai aiba caractere, el se reconstituie.
  13.     \param indexSet Indexul setului ales pentru extragere
  14.     \return Un caracter aleator din setul dorit
  15.  */
  16. char ExtrageCarAleator(string &mulCaracts, unsigned int indexSet)
  17. {
  18.     char carAles = ' ';
  19.     unsigned int indexCarAles = rand() % mulCaracts.length();
  20.  
  21.     //extragem caracterul generat
  22.     carAles = mulCaracts[indexCarAles];
  23.  
  24.     // eliminam caracterul extras din set si, daca este cazul, reconstituim setul
  25.     mulCaracts.erase(indexCarAles, 1);
  26.  
  27.     if(mulCaracts.empty())
  28.         switch(indexSet)
  29.         {
  30.         case 0:
  31.             mulCaracts = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  32.             break;
  33.         case 1:
  34.             mulCaracts = "abcdefghijklmnopqrstuvwxyz";
  35.             break;
  36.         case 2:
  37.             mulCaracts = "0123456789";
  38.             break;
  39.         case 3:
  40.             mulCaracts = multCarSpeciale;
  41.             break;
  42.         }
  43.  
  44.     return carAles;
  45. }
  46.  
  47. /*!
  48.     Construieste si returneaza un sir format aleator din elemente din 4 clase (cifre, litere (mici, mari), caractere speciale).
  49.     \param pLungimeMin Lungimea minima a sirului ce se doreste a fi returnat.
  50.     \param pFormat Specifica o constrangere a sirului rezultat. Prin constrangere se intelege o dorinta SIGURA de a avea, in sirul generat, anumite elemente din clase specifice. (implicit nu exista)
  51.     \param pLungimeMax Lungimea maxima a sirului ce se doreste a fi returnat. (implicit 50)
  52.     Constrangerile vin sub forma de caractere intr-un sir de caractere, fiecare avand urmatoarea interpretare :
  53.     - 'A' : se doreste ca in sirul rezultat sa existe cel putin o litera englezeasca \b MARE
  54.     - 'a' : se doreste ca in sirul rezultat sa existe cel putin o litera englezeasca \b mica
  55.     - '#' : se doreste ca in sirul rezultat sa existe cel putin o \b cifra
  56.     - '~' : se doreste ca in sirul rezultat sa existe cel putin un caracter \b special
  57.  
  58.     \return Sirul aleator generat tinand cont de eventualele constrangeri.
  59.  */
  60. string GenereazaParola(unsigned int pLungimeMin,
  61.                        const string &pFormat = "", unsigned int pLungimeMax = 50)
  62. {
  63.     string pGenerata = "";
  64.     string setCaractere[] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz",
  65.                              "0123456789", multCarSpeciale
  66.                             };
  67.     unsigned int nrElemPrezente = 0;
  68.     unsigned int indexClsGenerata = 0;
  69.     unsigned int pLungime = 0;
  70.  
  71.     if(pLungimeMin <= pLungimeMax &&
  72.             pFormat.length() <= pLungimeMin)
  73.     {
  74.         // pornim sirul generat de la elementele tiparului sugerat alese din domeniul lor de apartenenta
  75.         for(nrElemPrezente = 0; nrElemPrezente < pFormat.length(); ++nrElemPrezente)
  76.         {
  77.             switch(pFormat[nrElemPrezente])
  78.             {
  79.             case 'A':
  80.                 // alegem si adaugam un caracter englezesc (litera MARE)
  81.                 pGenerata += ExtrageCarAleator(setCaractere[0], 0);
  82.                 break;
  83.             case 'a':
  84.                 // alegem si adaugam un caracter englezesc (litera mica)
  85.                 pGenerata += ExtrageCarAleator(setCaractere[1], 1);
  86.                 break;
  87.             case '#':
  88.                 // alegem si adaugam o cifra
  89.                 pGenerata += ExtrageCarAleator(setCaractere[2], 2);
  90.                 break;
  91.             case '~':
  92.                 // alegem si adaugam un caracter special
  93.                 pGenerata += ExtrageCarAleator(setCaractere[3], 3);
  94.                 break;
  95.             }
  96.         }
  97.  
  98.         // alegem o lungime pentru sirul nostru
  99.         if(pLungimeMax != pLungimeMin)
  100.             pLungime = pLungimeMin + rand() % (pLungimeMax - pLungimeMin);
  101.         else
  102.             pLungime = pLungimeMin;
  103.  
  104.         // completam restul de elemente cu valori uniform alese din cele 4 clase impuse
  105.         while(nrElemPrezente++ < pLungime)
  106.         {
  107.             // alegem o valoare uniform distribuita pe intervalul [0, 4) si-i asociem un caracter
  108.             indexClsGenerata = rand() % 4;
  109.             pGenerata += ExtrageCarAleator(setCaractere[indexClsGenerata], indexClsGenerata);
  110.         }
  111.  
  112.         // amestecam elementele
  113.         random_shuffle(pGenerata.begin(), pGenerata.end());
  114.     }
  115.  
  116.     return pGenerata;
  117. }
  118.  
  119. int main()
  120. {
  121.     // initializam generatorul de numere pseudoaleatoare
  122.     srand(time(NULL));
  123.  
  124.     // doar cu titlu de prezentare, respectand restrictiile lui DB, dar cu lungime variabila
  125.     cout << GenereazaParola(6, "Aa##~~");
  126.  
  127.     return 0;
  128. }
3p / 1 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Return to Snippets

Who is online

Users browsing this forum: No registered users and 0 guests

cron