Générateur de mot de passe [aleatoirement ou par algorithme + decodage] [nombres, lettres (minuscules et majuscules)]

Description

Comme son nom l'indique cette source permet de générer un mot de passe.

2 modes de génération : Aléatoire et par algorithme interne

En aléatoire:
On peut choisir le nombres de caractères à générer, si on veut des nombre, des lettre ou les 2 et si on veut que ce soir en minuscule, majuscules ou les 2.

Par algorithme :
Les lettre (minuscules et majuscules) et les nombres sont imposés.
On peut aussi decoder le code en appliquant l'algorithme inverse.

C'est une source assez bateau mais ça peut etre pratique.

C 'est la première source que je poste alors restez indulgents svp !

Source / Exemple :


Public Class Form1
    Inherits System.Windows.Forms.Form

    '---En général--------------
    Dim lonMaxChar As Long = 10 'Nombre de caratère a tirer (ici fixé à 10 au démarrage)
    Dim lonMinChar As Long = 10 'Nombre de caratère a tirer au minimum (ici fixé à 10 au démarrage)
    Dim strKey As String 'chaine comportant le code généré
    Dim booIsMin As Boolean = False ' boolean indiquant si il y a un minimum de caratère voulu ou pas
    Dim booIsAlgo As Boolean = False ' boolean indiquant si on génère le mot de passe grace à la fonction algoritmique
    Dim strPassphrase As String = "passphrase" ' contient la passphrase de base pour générer le mot de passe
    Dim lonAlgo As Long 'contient un nombre obtenu lors de la génération algo

    '---Pour les fonctions--------------
    Dim booIsLetter As Boolean = True
    Dim booIsLetterMin As Boolean = True
    Dim booIsLetterMaj As Boolean = True
    Dim booIsNumber As Boolean = True

    '---Pour le tirage-------------------
    Dim lonDeterminLetterOrNumber As Long ' variant entre 1 et 2 (entiers) il determine si on tire une lettre ou un nombre 
    Dim lonLetter As Long 'n° ascii tiré au hasard pour determiner une lettre (entre 65 et 90)
    Dim lonNumber ' entier entre 0 et 9
    Dim lonMinOrMaj As Long ' variant entre 1 et 2 (entiers) il determine si on convertie la lettre  précedement tirée en une minuscules ou en une majuscule

    '---Pour les stats-----------------------
    Dim lonMin As Long = 0 'nbre de minuscules
    Dim lonMaj As Long = 0 'nbre de majuscules
    Dim lonNum As Long = 0 'nbre de nombres

 Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
        End
    End Sub

    Private Sub MenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem5.Click
        Call btnGen_Click(0, e)
    End Sub

    

    Private Sub btnGen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGen.Click

        If booIsAlgo = True Then
            Call GenAlgo()
            Exit Sub
        End If

        Dim x As Long
        Dim lonExitChar As Long
        Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
        strKey = Nothing
        txtKeybox.Clear()
        prgBar.Maximum = lonMaxChar

        StatusBar.Text = "Génération en cour..."
        For x = 1 To lonMaxChar

            If booIsLetter = True And booIsNumber = False Then ' si lettres et pas nombres
                Call Letter()
                Call MinOrMaj()
            End If

            If booIsLetter = False And booIsNumber = True Then 'si nombres et pas lettres
                Call Number()
            End If

            If booIsLetter = True And booIsNumber = True Then ' si lettres et nombres...
                Call LetterOrNumber() 'on choisit de tirer une lettre ou un nombre
                If lonDeterminLetterOrNumber = 1 Then 'ici c une lettre qu'on tire
                    'lettre
                    Call Letter()
                    Call MinOrMaj()
                Else 'et pis la bah c un nombre...
                    'nombre
                    Call Number()
                End If
            End If

            Select Case booIsMin
                Case Is = True

                    Select Case x
                        Case Is >= lonMinChar ' si on a atteint le nombre minimal de caratères voulu
                            Randomize()
                            lonExitChar = CInt((Int(2 * Rnd()) + 1))
                            Select Case lonExitChar 'on eput envisager de quitter la boucle
                                Case Is = 1 'bah pour une prochaine fois pe be
                                    Exit Select
                                Case Is = 2 ' non on quitte
                                    prgBar.Maximum = x
                                    prgBar.Value = x
                                    StatusBar.Text = "Compilation des éléments..." ' juste pcq ça met du temps a afficher le code généré
                                    Exit For
                            End Select

                        Case Is < lonMinChar
                            Exit Select
                    End Select

                Case Is = False
                    Exit Select
            End Select

            prgBar.Value = x
            If x = lonMaxChar Then ' juste pcq ça met du temps a afficher le code généré
                StatusBar.Text = "Compilation des éléments..."
            End If
        Next x

        txtKeybox.Text = strKey
        Cursor.Current = System.Windows.Forms.Cursors.Default
        StatusBar.Text = "Génération terminée"
        Call Stats()
    End Sub

    Private Function GenAlgo()

        'cette fonction est très peu dévellopé. Néenmmoin on peut entrevoir les base d'une génération de mot de passe en fct d'une string.

        'Comme je l'ai dit, le principe ici utilisé est relativement simple. Les nombres internes a la chaine obtenue apres génération sont constants (valeurs ascii + 32 +7) et les lettres aléatoires ne servent que de balises pour séparer les valeurs ascii dans le but d'un éventuel décodage du mot de passe et comparaison/analyse de la passphrase.

        Dim x As Long
        Dim strChar As String
        Dim stralgo As String
        Dim lonletter As Long
        Dim lonMinOrMaj As Long
        Dim strLetter As String
        Dim y As Long
        Dim lonCountBalises As Long

        Cursor.Current = System.Windows.Forms.Cursors.WaitCursor

        txtKeybox.Clear()
        lonMin = 0
        lonMaj = 0
        lonNum = 0

        StatusBar.Text = "Génération en cour..."
        prgBar.Maximum = Len(strPassphrase)

        For x = 1 To Len(strPassphrase)

            Randomize()
            lonCountBalises = CInt((Int(3 * Rnd())) + 1)
            For y = 1 To lonCountBalises
                Randomize() ' tire une ou plusieur lettres balises au hazard 
                lonletter = CInt((Int(25 * Rnd()) + 0)) 'code ascii des touche alphabetiques de 65 à 90 (a=65 z=90) 'Ici utilisé pour séparer 2 valeur ascii l'une de l'autre
                Randomize() ' determine si la lettre est minuscule ou majuscule. Juste pour faire ressortir un peu moin les valeurs ascii lors d'une comparaison de 2 passphrases par ex.
                lonMinOrMaj = CInt((Int(2 * Rnd()) + 1))
                Select Case lonMinOrMaj
                    Case Is = 1
                        Microsoft.VisualBasic.LCase(Chr(65 + lonletter))
                        lonMin = lonMin + 1
                    Case Is = 2
                        Microsoft.VisualBasic.UCase(Chr(65 + lonletter))
                        lonMaj = lonMaj + 1
                End Select
                strLetter = strLetter & (Chr(65 + lonletter))
            Next y

            strChar = Mid(strPassphrase, x, 1) ' obtient la lettre a convertir en code ascii
            stralgo = stralgo & strLetter & (Asc(strChar) + 7) 'code formé de lettre balise + (valeur ascii + 32 +7)... et ainsi de suite
            strLetter = Nothing

            prgBar.Value = x 'mise a jour de la progressbar
            If x = Len(strPassphrase) Then ' juste pcq ça met du temps a afficher le code généré
                StatusBar.Text = "Compilation des éléments..."
            End If
        Next x
        txtKeybox.Text = stralgo ' affihe le resultat obtenu a partir de la passphrase
        strKey = stralgo
        stralgo = Nothing
        StatusBar.Text = "Génération terminée"
        Cursor.Current = System.Windows.Forms.Cursors.Default
        Call Stats()

    End Function

    Private Function decod()

        ' ici on essais d'obtenir la passphrase originale a partir du code.
        'comme les lettres ne sont la que pour délimiter les valeurs ascii (nombres) on va juste extraire les groupes de nombres, en convertissant chaque groupe en sont caractère ascii et ainsi récupérer le passphrase original.

        Dim x As Long
        Dim LonLenStringNumeric As Long
        Dim strStringNumeric As String
        Dim booIsNumeric As Boolean = False
        Dim strDecodKey As String
        Dim booAddDecod As Boolean = False

        Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
        'si le code ne se termine pas par une ou plusieur lettres, la derrnière valeur ascii ne va pas etre extraite. Donc on rajoute simplement une lettre au code, pas ex "A".
        strKey = txtAlgo.Text
        strKey = strKey & "a"

        StatusBar.Text = "Décodage en cour..."
        prgBar.Maximum = Len(strKey)

        txtKeybox.Clear()

       
        For x = 1 To Len(strKey)

            If IsNumeric(Mid(strKey, x, 1)) = True Then 'si on est sur un groupe de nombres
                booIsNumeric = True
                booAddDecod = True
                strStringNumeric = strStringNumeric & Mid(strKey, x, 1) 'on stock le groupe ds une autre chaine
            Else
                If booAddDecod = True Then
                    strDecodKey = strDecodKey & Chr(Val(strStringNumeric) - 7) 'la passphrase d'origine est obtenue en concaténant caractères obtenus par "les groupes ascii"
                    strStringNumeric = Nothing
                    booAddDecod = False ' devient tt de suite faut pour empecher de répéter l'opération tant qu'on analyse pas des nombres
                End If

            End If

            prgBar.Value = x 'mise a jour de la progressbar
            If x = Len(strKey) Then ' juste pcq ça met du temps a afficher le code généré
                StatusBar.Text = "Compilation des éléments..."
            End If
        Next x

        txtKeybox.Text = strDecodKey
        StatusBar.Text = "Décodage terminé"

        Call Stats()
        Cursor.Current = System.Windows.Forms.Cursors.Default

    End Function

    Private Function Stats()
        Dim x As Long
        Dim lonCombi As Long
        Dim lontotnum As Long
        ' s'occupe d'afficher les statistiques

        Cursor.Current = System.Windows.Forms.Cursors.WaitCursor

        StatusBar.Text = "Calcul des statistiques et informations en cour..."
        prgBar.Maximum = Len(strKey)

        lblTotChar.Text = "Caractère(s) : " & Len(strKey)
        lblTotLetter.Text = "Lettre(s): " & (lonMin + lonMaj) & " (" & lonMin & " " & "min. et" & " " & lonMaj & " " & "maj." & ")"

        For x = 1 To Len(strKey)

            prgBar.Value = x

            If IsNumeric(Mid(strKey, x, 1)) = True Then
                lontotnum = lontotnum + 1
            End If
        Next x

        lblTotNumber.Text = "Nombre(s): " & lontotnum

        Try
            lonCombi = ((lonMin + lonMaj) ^ 50) + (lonNum ^ 10)
            'lblCombi.Text = "Combinaisons possibles : " & (lonMin + lonMaj) & "^50" & " + " & lonNum & "^10"
            lblCombi.Text = "Combinaisons possibles : " & lonCombi
        Catch err As Exception ' ici on evite l'erreur de dépassement de capacité car une variable de type LONG ne peux atteidre une valeur max que de 9223372036854775807
            If lonCombi >= 9223372036854775806 Then
                lblCombi.Text = "Combinaisons possibles : > 9223372036854775807"
            Else
                lblCombi.Text = "Combinaisons possibles : [Dépassement de capacité]" 'idealement il faudrait jouer sur l'exposant. Mais en attendant...
            End If
        End Try

        ' on purge le nombre de lettre et de nombre pour qu'il soit egal à 0 pour le prochain tirage
        lonNum = 0
        lonMin = 0
        lonMaj = 0

        Cursor.Current = System.Windows.Forms.Cursors.Default

        StatusBar.Text = "Calcul des statistiques et informations terminé"

    End Function

    Private Function MinOrMaj()
        If booIsLetterMaj = True And booIsLetterMin = False Then
            strKey = strKey & Microsoft.VisualBasic.UCase(Chr(65 + lonLetter))
            lonMaj = lonMaj + 1 'compte de nombre de maj pour les stats
            Exit Function
        End If
        If booIsLetterMaj = False And booIsLetterMin = True Then
            strKey = strKey & Microsoft.VisualBasic.LCase(Chr(65 + lonLetter))
            lonMin = lonMin + 1 'compte le nombre de min
            Exit Function
        End If

        If booIsLetterMaj = True And booIsLetterMin = True Then
            Randomize() ' determine si la lettre est minuscule ou majuscule
            lonMinOrMaj = CInt((Int(2 * Rnd()) + 1))
            Select Case lonMinOrMaj
                Case Is = 1
                    strKey = strKey & Microsoft.VisualBasic.LCase(Chr(65 + lonLetter))
                    lonMin = lonMin + 1
                Case Is = 2
                    strKey = strKey & Microsoft.VisualBasic.UCase(Chr(65 + lonLetter))
                    lonMaj = lonMaj + 1
            End Select
        End If
    End Function

    Private Function Number()
        'tire un nombre au hazard
        Randomize(lonNumber)
        lonNumber = CInt((Int(10 * Rnd()) + 0))
        strKey = strKey & lonNumber
        lonNum = lonNum + 1
    End Function

    Private Function Letter()
        Randomize() ' tire une lettre au hazard 
        lonLetter = CInt((Int(25 * Rnd()) + 0)) 'code ascii des touche alphabetiques de 65 à 90 (a=65 z=90)
    End Function

    Private Function LetterOrNumber()
        Randomize() ' determine si lettre ou chiffre a tirer 1=lettre 2=nombre
        lonDeterminLetterOrNumber = CInt((Int(2 * Rnd()) + 1))
    End Function

    Private Sub txtMaxChar_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtMaxChar.TextChanged
        Select Case txtMaxChar.Text
            Case Is = Nothing
                lonMaxChar = 0 'empeche d'avoir un nombre de caratères maximum = à rien et donc de générer une erreur
            Case Is <> Nothing
                lonMaxChar = txtMaxChar.Text
                If lonMaxChar > 32767 Then ' G limité a 32767 caratères pcq la txtKeyBox est limitée a 32767 caractères et que je voulais imosé un max. Mais y a déja po mal de marge pour un simple mot de passe.
                    lonMaxChar = 32767
                    txtMaxChar.Text = lonMaxChar
                End If
        End Select
    End Sub

    Private Sub txtMaxChar_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtMaxChar.Leave
        Select Case txtMaxChar.Text
            Case Is = Nothing
                lonMaxChar = 0
                txtMaxChar.Text = lonMaxChar 'empeche d'avoir un nombre de caratères maximum = à rien et donc de générer une erreur
                txtMaxChar.SelectionStart = 1
            Case Is <> Nothing
                lonMinChar = txtMinChar.Text
                If lonMaxChar > 32767 Then
                    lonMaxChar = 32767
                    txtMaxChar.Text = lonMaxChar
                End If
        End Select
    End Sub

    Private Sub txtMinChar_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtMinChar.TextChanged
        Select Case txtMinChar.Text
            Case Is = Nothing
                lonMinChar = 0 'empeche d'avoir un nombre de caratères minimum = à rien et donc de générer une erreur
            Case Is <> Nothing
                lonMinChar = txtMinChar.Text
                If lonMinChar > 32767 Then
                    lonMinChar = 32767
                    txtMinChar.Text = lonMaxChar
                End If
        End Select
    End Sub

    Private Sub txtMinChar_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtMinChar.Leave
        Select Case txtMinChar.Text
            Case Is = Nothing
                lonMinChar = 0
                txtMinChar.Text = lonMinChar 'empeche d'avoir un nombre de caratères minimum = à rien et donc de générer une erreur
                txtMinChar.SelectionStart = 1
            Case Is <> Nothing
                lonMinChar = txtMinChar.Text
                If lonMinChar > 32767 Then
                    lonMinChar = 32767
                    txtMinChar.Text = lonMaxChar
                End If
        End Select
    End Sub

    Private Sub txtAlgo_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtAlgo.TextChanged
        Select Case txtAlgo.Text
            Case Is = Nothing
                strPassphrase = " " 'empeche d'avoir une passphrase = à rien et donc de générer une erreur
            Case Is <> Nothing
                strPassphrase = txtAlgo.Text
                If Len(strPassphrase) > 800 Then 'au cas ou qq qui a du temps à perdre rentrerai un mot de passe trop gros...
                    strPassphrase = Microsoft.VisualBasic.Left(strPassphrase, 800)
                    txtAlgo.Text = strPassphrase
                End If
        End Select
    End Sub

    Private Sub txtAlgo_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtAlgo.Leave
        Select Case txtAlgo.Text
            Case Is = Nothing
                strPassphrase = " "
                txtAlgo.Text = strPassphrase 'empeche d'avoir un nombre de caratères minimum = à rien et donc de générer une erreur
                txtAlgo.SelectionStart = 1
            Case Is <> Nothing
                strPassphrase = txtAlgo.Text
                If Len(strPassphrase) > 800 Then 'au cas ou qq qui a du temps à perdre rentrerai un mot de passe trop gros...
                    strPassphrase = Microsoft.VisualBasic.Left(strPassphrase, 800)
                    txtAlgo.Text = strPassphrase
                End If
        End Select
    End Sub

    Private Sub btnCopy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCopy.Click
        ' met le code en mémoire
        Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
        StatusBar.Text = "Mise en mémoire du mot de passe"
        Clipboard.SetDataObject(strKey)
        Cursor.Current = System.Windows.Forms.Cursors.Default
        StatusBar.Text = "Mot de passe en mémoire"
    End Sub

    Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
        ' efface la mémoire (met un espace en fait) et la txtKeybox

        Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
        StatusBar.Text = "Effaçement du mot de passe et/ou de la mémoire"
        txtKeybox.Clear()
        txtAlgo.Text = Nothing
        strKey = Nothing
        Clipboard.SetDataObject(" ")

        Cursor.Current = System.Windows.Forms.Cursors.Default
        StatusBar.Text = "Effacement terminé"
    End Sub

    Private Sub chkMinChar_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkMinChar.CheckedChanged
        'True ou False, indique si il y a une possibilité minimum de caractères a tirer ou pas
        booIsMin = chkMinChar.Checked
    End Sub

    Private Sub chkNumber_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkNumber.CheckedChanged
        ' on choisi de tirer juste de nombres
        booIsNumber = True
        booIsLetter = False
    End Sub

    Private Sub chkLetter_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkLetter.CheckedChanged
        ' on choisi de tirer juste des lettres
        booIsLetter = True
        booIsNumber = False
    End Sub

    Private Sub chkNumberLetter_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkNumberLetter.CheckedChanged
        ' on choisi de tirer des nombres et des lettres
        booIsNumber = True
        booIsLetter = True
    End Sub

    Private Sub chkLetterMin_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkLetterMin.CheckedChanged
        'on choisi d'avoir que des lettres minuscules
        booIsLetterMin = True
        booIsLetterMaj = False
    End Sub

    Private Sub chkLetterMaj_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkLetterMaj.CheckedChanged
        ' on choisi d'avoir que des lettres majuscules
        booIsLetterMaj = True
        booIsLetterMin = False
    End Sub

    Private Sub chkLetterMinMaj_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkLetterMinMaj.CheckedChanged
        ' on choisit d'avoir des lettres minuscules et majuscules
        booIsLetterMin = True
        booIsLetterMaj = True
    End Sub

    Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem4.Click
        'affiche le form "a propos" (juste pour le fun :|)
        Dim form2 As Form
        form2 = New Form2()
        form2.Show()
    End Sub

    Private Sub chkAlgo_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkAlgo.CheckedChanged
        'True ou False, indique si le mot de passe est généré a partir de la passphrase
        booIsAlgo = chkAlgo.Checked
        If chkAlgo.Checked = True Then
            GroupBox8.Enabled = False
            GroupBox5.Enabled = False
        Else
            GroupBox8.Enabled = True
            GroupBox5.Enabled = True
        End If
    End Sub

    Private Sub btnDecod_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDecod.Click
        If chkAlgo.Checked = True Then
            Call decod()
        Else
            MsgBox("Pour générer la passphrase d'un code saisi " & Chr(13) & "vous devez être en mode" & Chr(13) & " Génération/Décodage Algorithmique.", MsgBoxStyle.Exclamation, "Attention")
        End If
    End Sub
End Class

Conclusion :


On peut surrement pas mal amméliorer cette source notamment au niveau de des statistiques (combinaisons possible, ...) pcq actuellement je n'arrive pas à empecher un dépassement de capacité. Il y a surement moyen de jouer sur les exposants donc si vous avez une idée n'hésitéz pas.

Evitez les comentaires qui ne sont pas "constructifs" merci.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.