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.
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.