Générateur de mot de passe

goldenboy

XLDnaute Occasionnel
Bonjour à tous,

J'ai créé une routine pour générer des mots passe, mais j'ai l'impression que cette routine ressort régulièrement les même mots de passe.

Sur 13817 générations, je ressors 2225 mots de passe différents (uniques). (tri sur doublons)

Qu'en pensez-vous ? Est-ce normal? Puis-je avoir plus de probabilité de générer des mots de passe différents ?

Les mots de passe générés sont volontairement composés de 6 lettres minuscules et 2 chiffres.

Code:
Dim TabCarNum, TabCarMin, mdp, Lettre As String
Dim NbAleat, NbAleat2, i, NbChoix, Passage_En_Chiffre, Passage_En_Lettre As Integer

TabCarNum = "1234567890"
TabCarMin = "abcdefghijklmnopqrstuvwxyz"

mdp = ""
Passage_En_Chiffre = 0
Passage_En_Lettre = 0


Do While Len(mdp) < 8
    Randomize
    NbChoix = Int(2 * Rnd) + 1
     If NbChoix = 1 Then 'lettre
      If Passage_En_Lettre < 6 Then
       Passage_En_Lettre = Passage_En_Lettre + 1
       Randomize
       NbAleat = Int(26 * Rnd) + 1
       Lettre = Mid(TabCarMin, NbAleat, 1)
       mdp = mdp & Lettre
      Else
       Passage_En_Chiffre = Passage_En_Chiffre + 1
       Randomize
       NbAleat = Int(9 * Rnd) + 1
       mdp = mdp & NbAleat
      End If
     ElseIf NbChoix = 2 Then 'chiffre
       If Passage_En_Chiffre < 2 Then
        Passage_En_Chiffre = Passage_En_Chiffre + 1
        Randomize
        NbAleat = Int(9 * Rnd) + 1
        mdp = mdp & NbAleat
       Else
        Passage_En_Lettre = Passage_En_Lettre + 1
        Randomize
        NbAleat = Int(26 * Rnd) + 1
        Lettre = Mid(TabCarMin, NbAleat, 1)
        mdp = mdp & Lettre
       End If
     End If
Loop

debug.print mdp

Par avance, je vous remercie.
 

goldenboy

XLDnaute Occasionnel
Re : Générateur de mot de passe

Première modification :

NbAleat = Int(10 * Rnd) + 1
Chiffre = Mid(TabCarNum, NbAleat,1)
mdp = mdp & Chiffre

Ce qui permet d'intégrer le zero. cela ne change rien aux résultats de mots de passe uniques générés mais augmente le nombre de mot de passe unique générables.

Je suis à 2200 mots de passe uniques sur 22000 générations. (soit 90 % des mots de passe générés l'ont déjà été)

Code:
Dim TabCarNum, TabCarMin, mdp, Lettre As String
Dim NbAleat, NbAleat2, i, NbChoix, Passage_En_Chiffre, Passage_En_Lettre As Integer
Dim Chiffre As Byte
 
TabCarNum = "1234567890"
TabCarMin = "abcdefghijklmnopqrstuvwxyz"
 
mdp = ""
Passage_En_Chiffre = 0
Passage_En_Lettre = 0
 

Do While Len(mdp) < 8
     Randomize
     NbChoix = Int(2 * Rnd) + 1
      If NbChoix = 1 Then 'lettre
       If Passage_En_Lettre < 6 Then
        Passage_En_Lettre = Passage_En_Lettre + 1
        Randomize
        NbAleat = Int(26 * Rnd) + 1
        Lettre = Mid(TabCarMin, NbAleat, 1)
        mdp = mdp & Lettre
       Else
        Passage_En_Chiffre = Passage_En_Chiffre + 1
        Randomize
        NbAleat = Int(10 * Rnd) + 1
        Chiffre = Mid(TabCarNum, NbAleat,1)
        mdp = mdp & Chiffre
       End If
      ElseIf NbChoix = 2 Then 'chiffre
        If Passage_En_Chiffre < 2 Then
         Passage_En_Chiffre = Passage_En_Chiffre + 1
         Randomize
         NbAleat = Int(10 * Rnd) + 1
         Chiffre = Mid(TabCarNum, NbAleat,1)
         mdp = mdp & Chiffre
        Else
         Passage_En_Lettre = Passage_En_Lettre + 1
         Randomize
         NbAleat = Int(26 * Rnd) + 1
         Lettre = Mid(TabCarMin, NbAleat, 1)
         mdp = mdp & Lettre
        End If
      End If
 Loop
 
debug.print mdp
 

Misange

XLDnaute Barbatruc
Re : Générateur de mot de passe

Bonjour
Pour ne pas te laisser tout seul :)
Juste une idée comme ça pour éviter d'avoir trop de doublons : pour chaque password tu stockes cette valeur dans un dictionnaire. Si ça crée une erreur (le password est donc déjà dedans, tu passes au suivant. Et tu arrêtes ta macro quand tu as le nb de password que tu souhaites et du coup tu injectes le résultat en une seule fois dans la feuille ce qui est bien plus efficace.
 

Victor21

XLDnaute Barbatruc
Re : Générateur de mot de passe

Bonjour, goldenboy.

Cette formule sur 100000 lignes :
=CAR(ALEA.ENTRE.BORNES(48;57))&CAR(ALEA.ENTRE.BORNES(97;122))&CAR(ALEA.ENTRE.BORNES(97;122))&CAR(ALEA.ENTRE.BORNES(97;122))&CAR(ALEA.ENTRE.BORNES(97;122))&CAR(ALEA.ENTRE.BORNES(97;122))&CAR(ALEA.ENTRE.BORNES(97;122))&CAR(ALEA.ENTRE.BORNES(48;57))
me renvoie 100000 chaines différentes du type xaaaaaax (x=0 à 9; A=a à z). Mais ça raaame...

Edit : Bonjour, Misange :)
 

goldenboy

XLDnaute Occasionnel
Re : Générateur de mot de passe

Bonjour Misange,

Merci pour ton idée.
Mon but n'est pas de créer une grande quantitié de mots de passe uniques, mais je souhaitai simplement pouvoir accéder à toutes les valeurs possibles que propose la chaine de caractère que je créer.
Un peu comme si je faisais un tirage loto, mais qu'il m'était impossible d'acceder à toutes les combinaisons posibles.

Du coup, j'ai tenté d'enlever les "Randomize".
Code:
sub GenereMdp()
Dim TabCarNum, TabCarMin, mdp, Lettre As String
 Dim NbAleat, NbAleat2, i, NbChoix, Passage_En_Chiffre, Passage_En_Lettre As Integer
 Dim Chiffre As Byte
Dim DLigne As long
  
 TabCarNum = "1234567890"
 TabCarMin = "abcdefghijklmnopqrstuvwxyz"
  
 mdp = ""
 Passage_En_Chiffre = 0
 Passage_En_Lettre = 0
  
 
Do While Len(mdp) < 8

      NbChoix = Int(2 * Rnd) + 1
       If NbChoix = 1 Then 'lettre
        If Passage_En_Lettre < 6 Then
         Passage_En_Lettre = Passage_En_Lettre + 1

         NbAleat = Int(26 * Rnd) + 1
         Lettre = Mid(TabCarMin, NbAleat, 1)
         mdp = mdp & Lettre
        Else
         Passage_En_Chiffre = Passage_En_Chiffre + 1

         NbAleat = Int(10 * Rnd) + 1
         Chiffre = Mid(TabCarNum, NbAleat,1)
         mdp = mdp & Chiffre
        End If
       ElseIf NbChoix = 2 Then 'chiffre
         If Passage_En_Chiffre < 2 Then
          Passage_En_Chiffre = Passage_En_Chiffre + 1

          NbAleat = Int(10 * Rnd) + 1
          Chiffre = Mid(TabCarNum, NbAleat,1)
          mdp = mdp & Chiffre
         Else
          Passage_En_Lettre = Passage_En_Lettre + 1

          NbAleat = Int(26 * Rnd) + 1
          Lettre = Mid(TabCarMin, NbAleat, 1)
          mdp = mdp & Lettre
         End If
       End If
  Loop
  

DLigne = sheets(1).range("A1").end(xldown).row
sheets(1).range("A" & DLigne + 1).value = mdp

End Sub

Sub multi()

Sheets(1).range("A1").value = "MDP :"
Sheets(1).range("A2").value = "MDP :"
Application.ScreenUpdating = False
For i = 1 to 22000 step 1
call GenereMdp
next i
Application.ScreenUpdating = True
End Sub
Avec ce code, sur 22000 générations, j'obtiens 22000 mots de passe uniques. :)
Je ne comprend pas vraiment l'impact de "Randomize" sur la fonction "Rnd", mais il y a un impact certain sur le résultat obtenu.

Edit : sur 50000, j'obtiens également 50000 mots de passe uniques.
Edit 2 : Bonjour Victor21. Je viens de tester pour 100 000 mots de passe, et j'obtiens 100 000 mdp uniques.
Je vais tester avec 200 000 et si c'est le cas, je vais garder cette dernière solution sans "Randomize".
Edit 3 : 200 000 générations m'ont données 200 000 mdp uniques.
Je vais donc garder cette solution qui doit comporter plusieurs millions de solutions. Je pense que si j'aurais testé le million de génération j'aurais peut être pu avoir des doublons.
 
Dernière édition:

Misange

XLDnaute Barbatruc
Re : Générateur de mot de passe

Si tu t'étais mieux exprimé :)
Par définition, randomize rebat les cartes à chaque tour de boucle. Donc forcément tu as des doublons.
Avec ta solution actuelle certes tu génères tous les mots possibles mais ils sont classés par ordre alphanumérique. Si l'objectif c'est de savoir combien tu peux en générer, mieux vaut faire le CALCUL des combinaisons plutot que de les générer ! Avec 26 lettres et 10 chiffres t'es pas arrivé.
Quel est l'intérêt d'avoir une liste de mots de passes triés alpha ????
 

goldenboy

XLDnaute Occasionnel
Re : Générateur de mot de passe

Misange,

Je comprends pas pourquoi tu dis qu'ils sont triés par ordre alpha.
Voici les 30 premiers mdp générés :
53etploo
89hjthcl
hs8ujfo7
83awtjco
fj97ndcz
u05jncgt
0h0svelc
69wlwmvm
km17dkwp
9dpqoo2j
g17zfvry
ls9l5jnv
i0zeu6ds
drak20em
j33urloj
s1h1qgkv
20wiqsen
z90yokmk
6bzkm3hr
r1jo8lss
grymz32i
69smzijj
b91cxoea
52jebdsu
86mubimi
2zngs9bp
d8qceok8
5lmfuoq3

Je viens de faire une simulation loto, pour me rendre compte des possibilités de doublons. Au loto il y a environ 14 M de possibilités.
Code:
Sub test()

NbAleat = Int(50 * Rnd) + 1
mdp = NbAleat
For i = 1 To 4
    
       NbAleat = Int(49 * Rnd) + 1
       mdp = mdp & " - " & NbAleat
Next i

NbAleat = Int(9 * Rnd) + 1
mdp = mdp & " / " & NbAleat

DLigne = Sheets("Feuil1").Range("A1").End(xlDown).Row
Sheets("Feuil1").Range("A" & DLigne + 1).Value = mdp
End Sub
Sub multi()
For i = 1 To 50000 Step 1
Call test
Next i
End Sub

Avec ce code, j'ai obtenu des doublons a partir de 20 000 tirages.
Je pense simplement que la combinaison de lettre et de chiffre que je génère donne beaucoup plus que 14 M de possibilité. D'où les 200 000 combinaisons uniques sorties sur 200 000 tirées.

Je n'ai pas dans l'objectif de savoir combien de mdp je peux générer, ni même en générer en masse.
Je me suis simplement rendu compte avec mon premier code que j'obtenais seulement 10 % de combinaison uniques sur un tirage de 20 000, alors que normalement il y a plus de 14 M de possibilité.
Je me suis alors dit :
- Soit j'ai une chance énorme
- Soit j'ai un problème dans mon code qui ne génère pas vraiment de l'aléatoire.

Je crois que "l'aléatoire" est beaucoup moins mis en évidence en utilisant "Randomize".
Peut-être que je me trompe, peut être que je n'ai pas bien compris l'action de "Randomize"...
 

bof

XLDnaute Occasionnel
Re : Générateur de mot de passe

Bonjour,
Une variante testée pour 200 000 codes en 13"
(23" avec détection des doublons : 1 seul doublon détecté pour 20 tirages de 200 000)
A+
 

Pièces jointes

  • genecode.xlsm
    20.3 KB · Affichages: 95

goldenboy

XLDnaute Occasionnel
Re : Générateur de mot de passe

Bonsoir pierrejean, bonsoir bof,

Dans vos deux méthodes, aucun de vous deux n'utilise le mot "Randomize". Pourquoi?

pierrejean : Si je ne me trompe pas, tes codes ne commencerons jamais par un chiffre et ne terminerons jamais non plus par un chiffre.
Ce qui ne donne pas le même nombre de combinaison maximum et par conséquent un nombre plus important de chance d'avoir un doublon.
Même si je ne cherche pas le nombre maximum de mdp possible à générer, mais que je cherche plutôt à me rapprocher le plus possible d'un tirage "chance" que d'un tirage qui semble trop répétitif à mon gout.

D'où la question Randomize or not randomize ?
 

ROGER2327

XLDnaute Barbatruc
Re : Générateur de mot de passe

Bonjour à tous.


Une fonction fournissant un mot de passe composé de l lettres minuscules et de c chiffres :​
Code:
Function Mdp$(l%, c%)
Dim j%, k%, s$
  For j = 1 To l: s = s & Chr(97 + Int(26 * Rnd)): Next
  For j = j To l + c: k = Int(j * Rnd): s = Mid$(s, 1, k) & CStr(Int(10 * Rnd)) & Mid$(s, 1 + k, j - 1 - k): Next
  Mdp = s
End Function

Procédure de tirage de 20 000 mots de passe de 6 lettres et 2 chiffres :​
Code:
Sub TestMdp()
Dim i&, v$()
Const l% = 6, c% = 2, n& = 20000
  ReDim v(1 To n, 0)
  Randomize
  For i = 1 To n: v$(i, 0) = Mdp(l, c): Next
  [A1].Resize(n).Value = v
End Sub
Je n'ai pas écrit de contrôle des doublons. (Il y en a très peu souvent sur 20 000 tirages.)​


Bonne journée.


ℝOGER2327
#7211


Vendredi 27 Pédale 141 (Saint Valens, frère onirique - fête Suprême Tierce)
1[SUP]er[/SUP] Germinal An CCXXII, 1,9771h - primevère
2014-W12-5T04:44:42Z


P.s. : À propos de "Randomize". Très utile. Il suffit de le placer là où il doit être : voir l'aide de VBA en utilisant la magique touche (je parle de la touche F1).
 

Pièces jointes

  • MotsDePasse.xlsm
    19 KB · Affichages: 138
Dernière édition:

goldenboy

XLDnaute Occasionnel
Re : Générateur de mot de passe

Bonjour Roger.

La fonction est puissante, je pense que c'est le code le plus rapide.
Sur un tirage d'1 million de mot de passe, deux fois de suite, je n'ai eu aucun doublon.
Et pourtant, tu utilises "Randomize".

Je n'ai pas accès à l'aide d'excel sur mon poste de travail :-(, et sur le net, je ne comprend pas forcement tout.
Ce lien n'existe plus

Si tu as plus d'explication à me donner sur cette fonction, je suis preneur.

Bien cordialement.
 

pierrejean

XLDnaute Barbatruc
Re : Générateur de mot de passe

Re

Bravo a ROGER (je vais tenter de comprendre !!)

@ goldenboy
Mon essai offrait des 'garanties ' pas forcement nécessaires : 6 lettres différentes , 2 chiffres différents , pas de doublons
Quant à la position des chiffres interdite en début ou fin ce n'est que de l’incompétence de ma part

Pour voir l'action de randomize teste le fichier joint
a) lancer test1 ,noter les résultats , fermer sans enregistrer puis relancer test1 et comparer avec les résultats précédents
b) procéder de même avec test2
c) revenir à test1
 

Pièces jointes

  • randomize.xls
    34 KB · Affichages: 106

Discussions similaires

Statistiques des forums

Discussions
312 396
Messages
2 088 054
Membres
103 709
dernier inscrit
FrrankX