petit plus, les mots de pass conservés sont encodés Vigenere
Rappel : Password Generator permet en premier lieu de generer des mots de pass complexe
la variable Ref.s ligne 272 contient "l'alphabet" qui sert a generer les mots de pass
je vous conseille de personnaliser cet Alphabet ! c'est dans cet alphabet que seront choisi les carateres qui formeront le mot de pass
si vous demandez un mot de pass d'une longueur de 13 lettres, avec le meme Level
ce sera toujours le même mot de pass qui sera généré !! ( a condition que la Variable REF.s ne change pas )
l'alphabet conditionne les listes genérés .. bien comprendre que changer l'alphabet et vous ne pourrez plus retrouver les meme mots de pass...
il faut definir l'alphabet, et ne plus y toucher ...
c'est une sécurité pour pouvoir retrouver un mot de pass qu'on aurai perdu ....
il suffit de connaître la longueur du mot de pass et son level pour le retrouver (en ayant le meme Alphabet bien sur )
vous pouvez bien sur directement ecrire votre propre mot de pass dans le champs prevu a cette effet
vous entrez le login éventuellement
le bouton [sauve] permet de sauver la fiche ,
le prg vous demandera le nom de la fiche ... entrez par exemple "Site : http://www.meteo.fr"
soyez explicite dans le choix des noms, ça permet de s'y retrouver par la suite
le bouton [Supr] permet de supprimer une fiche
le bouton [edit] permet d'editer une fiche .. (ce point est sûrement a revoir )
on a plus vite fait de supprimer la fiche , et de la refaire ..
Le bouton [Genere] , va tout simplement générer un mot de pass qui utilisera les paramètres "Nbr de caractere" et "Level"
Le bouton [tri], permet de trier par ordre alphabetique la liste des fiches contenant le password
Le bouton [password Prg] , permet de proteger l'acces au prg par un mot de pass
Code : Tout sélectionner
;***********************************************
;Titre :*password_generator
;Auteur : Dobro
;Date :11/01/2016
;Heure :16:53:16
;Version Purebasic : PureBasic 5.50 (Windows - x86)
;Version de l'editeur :EPB V2.62
; Libairies necessaire : Aucune
; info : le password est generé avec le contenu de la variable Ref.s (dans la procedure password )
; on peut y mettre ce que l'on veux comme caractere !! genre : ref.s="01"
;***********************************************
Declare gadgetballoontooltip(windownumber.l, gadgetnumber.l, text.s)
Declare changegadgetballoontooltip(tooltip.l, gadgetnumber.l, text.s)
Declare freeballoontooltip(tooltip.l)
Declare openwindow_win()
Declare.s password(longueur, level.i)
Declare sauvegarde_fiche()
Declare charge_fiche()
Declare.s rallonge_password(pass.s,longueur_pass)
Declare.s vigenere(txt.s,pass.s,mode)
Declare Recherche(Terme.s)
;{- Enumerations / DataSections
;{ Windows
Enumeration
#Win
#file
EndEnumeration
;}
;{ Gadgets
Enumeration
#Button_pass
#Button_gen
#Button_sauve
#Button_edit
#button_supr
#button_tri
#button_recherche
#Text_1
#Text_2
#String_nbr_car
#String_level
#Text_Auteur
#String_out
#liste
#Text_login
#String_Login
#Text_pass
#Text_titre
#font
EndEnumeration
;}
;{ Fonts
Enumeration
#Font_Text_titre
EndEnumeration
Structure fiche
nom.s
Longueur.i
Level.i
password.s
login.s
EndStructure
Global NewList fiche.fiche()
Global Button_gen_Tooltip,level.i,longueur.i,nom_pass.s,index
Global Clef.s="dobro" ; clef qui sert a l'encryptage/decryptage
; on lit le fichier de mot de pass
OpenFile(#file,"pass.inf") ; on le lit
pass_gen.s=ReadString(#file)
CloseFile(#file)
pass_gen.s=vigenere(pass_gen.s,clef.s,0)
p.s=InputRequester("Question","entrez le mot de pass","",#PB_InputRequester_Password)
If p.s<>pass_gen.s
End
EndIf
;}
OpenWindow_Win()
charge_fiche()
;{- Event loop
Repeat
Event = WaitWindowEvent(12)
Select Event
; ///////////////////
Case #PB_Event_Gadget
Select EventGadget()
Case #Button_gen
longueur.i=Val(GetGadgetText(#String_nbr_car)) ; recup la longueur
level.i=Val(GetGadgetText(#String_level)) ; recupe le level ...et zou²
passwrd.s=password(longueur.i, level.i) ; genere le passwords
SetGadgetText(#String_out,passwrd.s)
;;SetGadgetText(#string_login,login.s)
;;SetClipboardText(passwrd.s)
Case #Text_1
Case #Text_2
Case #String_nbr_car
longueur.i=Val(GetGadgetText(#String_nbr_car))
Case #String_level
level.i=Val(GetGadgetText(#String_level))
Case #Text_Auteur
Case #button_recherche
Terme.s=InputRequester("Recherche","Entrer le Terme Recherché","")
Recherche(Terme.s)
Case #button_tri
SortStructuredList( Fiche(),#PB_Sort_Ascending |#PB_Sort_NoCase , OffsetOf(Fiche\nom.s), TypeOf(Fiche\nom.s) )
ClearGadgetItems(#liste)
ForEach Fiche()
AddGadgetItem(#liste,-1, fiche()\nom.s)
Next
Sauvegarde_fiche()
Case #Button_pass
pass_gen.s=InputRequester("Question","entrez un mot pass pour proteger vos données","",#PB_InputRequester_Password)
pass_gen.s=vigenere(pass_gen.s,clef.s,1)
OpenFile(#file,"pass.inf",#PB_Ascii )
WriteStringN(#file,pass_gen.s,#PB_Ascii )
CloseFile(#file)
MessageRequester("Info","Ok mot de pass Sauvé")
Case #String_out
Case #String_Login
Case #liste
If GetGadgetState(#liste)<>-1
index=GetGadgetState(#liste)
SelectElement(Fiche(),index)
SetGadgetText(#String_level,Str(fiche()\Level.i))
SetGadgetText(#String_nbr_car,Str(fiche()\Longueur.i))
SetGadgetText(#String_out,fiche()\password.s)
SetGadgetText(#string_login,fiche()\login.s)
EndIf
Case #Button_sauve
nom_pass.s=""
nom_pass.s = InputRequester("nom de la fiche", "entrez un nom pour cette fiche","")
AddGadgetItem(#liste,-1, nom_pass.s )
AddElement(fiche())
fiche()\nom.s=nom_pass.s ; recup le nom de la fiche
fiche()\Longueur.i=Val(GetGadgetText(#String_nbr_car)) ; recup la longueur
fiche()\Level.i=Val(GetGadgetText(#String_level)) ; recupe le level
fiche()\password.s=GetGadgetText(#String_out); recup le password
fiche()\login.s=GetGadgetText(#string_login); recup le login
Sauvegarde_fiche()
charge_fiche()
Case #button_edit
nom_pass.s="": Resultat$=""
If GetGadgetState(#liste)<>-1
index=GetGadgetState(#liste)
Resultat$ = GetGadgetItemText(#liste,index)
nom_pass.s = InputRequester("nom de la fiche", "entrez un nom pour cette fiche", Resultat$)
If nom_pass.s<>""
RemoveGadgetItem(#liste,index)
SetGadgetItemText(#liste, index, nom_pass.s)
SelectElement(fiche(), index)
fiche()\nom.s=nom_pass.s ; pose le nom dans la fiche
Sauvegarde_fiche()
charge_fiche()
EndIf
Else
MessageRequester("info,","selectionnez un element dans la liste avant edition .")
EndIf
Case #button_supr
If GetGadgetState(#liste)<>-1
index=GetGadgetState(#liste)
Resultat$ = GetGadgetItemText(#liste,GetGadgetState(#liste))
If Resultat$ <>""
RemoveGadgetItem(#liste,index)
SelectElement(fiche(), index)
DeleteElement(fiche())
Sauvegarde_fiche()
charge_fiche()
EndIf
Else
MessageRequester("info,","selectionnez un element dans la liste avant suppression .")
EndIf
EndSelect
; ////////////////////////
Case #PB_Event_CloseWindow
Select EventWindow()
Case #Win
Sauvegarde_fiche()
CloseWindow(#Win)
Break
EndSelect
EndSelect
ForEver
;
;}
; Zone procedures
; Create tooltip
Procedure GadgetBalloonToolTip(WindowNumber.l, GadgetNumber.l, Text.s)
Protected Tooltip.l, Balloon.TOOLINFO
Tooltip = CreateWindowEx_(0, "ToolTips_Class32", "", #WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON, 0, 0, 0, 0, WindowID(WindowNumber), 0, GetModuleHandle_(0), 0)
SendMessage_(Tooltip, #TTM_SETTIPTEXTCOLOR, GetSysColor_(#COLOR_INFOTEXT), 0)
SendMessage_(Tooltip, #TTM_SETTIPBKCOLOR, GetSysColor_(#COLOR_INFOBK), 0)
SendMessage_(Tooltip, #TTM_SETMAXTIPWIDTH, 0, 180)
Balloon\cbSize = SizeOf(TOOLINFO)
Balloon\uFlags = #TTF_IDISHWND | #TTF_SUBCLASS
If IsGadget(GadgetNumber)
Balloon\hwnd = GadgetID(GadgetNumber)
Balloon\uId = GadgetID(GadgetNumber)
Else
Balloon\hwnd = GadgetNumber
Balloon\uId = GadgetNumber
EndIf
Balloon\lpszText = @Text
SendMessage_(Tooltip, #TTM_ADDTOOL, 0, @Balloon)
ProcedureReturn Tooltip
EndProcedure
; Change tooltip text
Procedure ChangeGadgetBalloonToolTip(Tooltip.l, GadgetNumber.l, Text.s)
Protected Balloon.TOOLINFO
Balloon\cbSize = SizeOf(TOOLINFO)
Balloon\uFlags = #TTF_IDISHWND | #TTF_SUBCLASS
If IsGadget(GadgetNumber)
Balloon\hwnd = GadgetID(GadgetNumber)
Balloon\uId = GadgetID(GadgetNumber)
Else
Balloon\hwnd = GadgetNumber
Balloon\uId = GadgetNumber
EndIf
Balloon\lpszText = @Text
SendMessage_(Tooltip, #TTM_ADDTOOL, 0, @Balloon)
EndProcedure
; Free tooltip
Procedure FreeBalloonTooltip(Tooltip.l)
DestroyWindow_(Tooltip.l)
EndProcedure
;
;}
Procedure OpenWindow_Win()
LoadFont(#font,"Arial",10,#PB_Font_Bold )
x_espace=100 :y_espace=50
If OpenWindow(#Win, 583, 160, 308+x_espace, 390+y_espace, "password_generator", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
;If CreateGadgetList(WindowID(#Win))
ButtonGadget(#button_tri, 215+x_espace, 305, 85, 25, "Tri")
ButtonGadget(#Button_pass, 215+x_espace, 345, 85, 25, "password prg")
ButtonGadget(#Button_gen, 215+x_espace, 60, 85, 25, "Genere")
ButtonGadget(#button_recherche, 215+x_espace, 90, 85, 25, "Recherche")
;
ButtonGadget(#Button_sauve, 220+x_espace, 150, 85, 25, "Sauve")
ButtonGadget(#Button_edit, 220+x_espace, 180, 85, 25, "Edit")
ButtonGadget(#button_supr, 220+x_espace, 210, 85, 25, "Supr")
TextGadget(#Text_1, 0, 65, 75, 20, "Nbr Caracteres:")
TextGadget(#Text_2, 115, 65, 35, 20, "Level :")
StringGadget(#String_nbr_car, 75, 60, 30, 20, "6", #PB_String_Numeric)
StringGadget(#String_level, 150, 60, 25, 20, "1", #PB_String_Numeric)
TextGadget(#Text_Auteur, 0, 370+y_espace, 70, 20, "By Dobro")
StringGadget(#String_out, 70, 120, 230, 20, "")
ListViewGadget(#liste, 10, 145, 200+x_espace, 220+y_espace,#PB_ListView_Multiselect)
SetGadgetFont(#liste, FontID(#font))
SetGadgetColor(#liste, #PB_Gadget_BackColor ,RGB(136,213,0))
TextGadget(#Text_login, 25, 90, 35, 20, "Login")
StringGadget(#String_Login, 70, 90, 230, 20, "")
TextGadget(#Text_pass, 20, 120, 40, 20, "Passwrd")
TextGadget(#Text_titre, 45, 5, 250, 35, "PassWord_Generator", #PB_Text_Center)
; Gadget Fonts
SetGadgetFont(#Text_titre, LoadFont(#Font_Text_titre, "Microsoft Sans Serif", 14, #PB_Font_HighQuality))
;EndIf
EndIf
EndProcedure
Procedure.s password(longueur, level.i)
;by Dobro
ref.s="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ; les caracteres qui vont composer le passWord; ça peut etre n'importe quoi !! (hehe)
long_ref=Len(ref.s)-CountString(ref.s,",")
RandomSeed(level.i)
For i=1 To longueur
;
; prends une lettre au hasard dans Ref.s
de=Random(long_ref,1)
car.s=Mid( ref.s,de,1) : cari.i=Asc(car.s)
;
text_sorti.s=text_sorti.s+car.s ;
Next i
ProcedureReturn text_sorti.s
EndProcedure
Procedure Sauvegarde_fiche()
If FileSize("fiches_password.inf")<>-1
DeleteFile("fiches_password.inf", #PB_FileSystem_Force)
EndIf
OpenFile(#file,"fiches_password.inf" )
ForEach fiche()
encode=1
Select Encode
Case 1
;nom.s=Encode_text(8,clef.s,fiche()\nom.s)
nom.s=vigenere(fiche()\nom.s,clef.s,1)
WriteStringN(#file,nom.s ) ; ecrit le nom de la fiche
; Longueur1.s=Encode_text(8,clef.s,str(fiche()\Longueur.i))
Longueur1.s=vigenere(Str(fiche()\Longueur.i),clef.s,1)
WriteStringN(#file,Longueur1.s ); ecrit la longueur
; Level1.s =Encode_text(8,clef.s,str(fiche()\Level.i ))
Level1.s =vigenere(Str(fiche()\Level.i ),clef.s,1)
WriteStringN(#file,Level1.s ); ecrit le level
;password1.s=Encode_text(8,clef.s,fiche()\password.s)
password1.s=vigenere(fiche()\password.s,clef.s,1)
WriteStringN(#file,password1.s ) ; ecrit le password
;login1.s=Encode_text(8,clef.s,fiche()\login.s)
login1.s=vigenere(fiche()\login.s,clef.s,1)
WriteStringN(#file,login1.s ) ; ecrit le password
Case 0; pour eventuellement sauver tout en clair !!
nom.s=fiche()\nom.s
WriteStringN(#file,nom.s ) ; ecrit le nom de la fiche
Longueur1.s=Str(fiche()\Longueur.i)
WriteStringN(#file,Longueur1.s ); ecrit la longueur
Level1.s =Str(fiche()\Level.i )
WriteStringN(#file,Level1.s ); ecrit le level
password1.s=fiche()\password.s
WriteStringN(#file,password1.s ) ; ecrit le password
login1.s=fiche()\login.s
WriteStringN(#file,login1.s ) ; ecrit le password
EndSelect
Next
CloseFile(#file)
EndProcedure
;
Procedure charge_fiche()
ClearGadgetItems(#liste)
If FileSize("fiches_password.inf")<>-1
OpenFile(#file,"fiches_password.inf" )
compteur=0
ClearList(Fiche())
While Eof(#file) = 0
AddElement(fiche())
charge_clair=1 ; ici mettre a 0 pour charger une fiche non crypté (ancien code )
If charge_clair=1
fiche()\nom.s=vigenere(ReadString(#file),clef.s,0)
fiche()\Longueur.i=Val(vigenere(ReadString(#file),clef.s,0))
fiche()\Level.i=Val(vigenere(ReadString(#file),clef.s,0))
fiche()\password.s=vigenere(ReadString(#file),clef.s,0)
fiche()\login.s=vigenere(ReadString(#file),clef.s,0)
Else
;pour rendre compatible avec l'ancienne version , charge la fiche non crypté
fiche()\nom.s=ReadString(#file ) ; ecrit le nom de la fiche
fiche()\Longueur.i=Val(ReadString(#file ));lit la longueur
fiche()\Level.i=Val(ReadString(#file )); lit le level
fiche()\password.s=ReadString(#file ) ; lit le password
fiche()\login.s=ReadString(#file ) ; lit le login
EndIf
;calldebugger
If fiche()\nom.s=""
DeleteElement(fiche())
Else ; affiche dans la liste
AddGadgetItem(#liste, compteur, fiche()\nom.s)
compteur=compteur+1
Endif
Wend
CloseFile(#file)
EndIf
EndProcedure
;
Procedure.s rallonge_password(pass.s,longueur_pass)
; By Zorro
; le but de cette procedure, est de rallonger un mot de pass en prenant des lettres de ce mot de pass
; de la sorte, on peut avoir un mot de pass aussi long que le truc qu'on encode/decode
; ce qui garantie un quasi inviolabilité du codage :o)
Protected passwrd.s,long
RandomSeed(8) ; <<<< ceci pour etre sur qu'avec un mot de pass precis, on est toujours le meme résultat une fois rallongé !! (pour le decodage c'est mieux LOL )
; par exemple avec le pass "Soleil" et la longueur 23 on aura toujours ceci de genréré : "SoleilieoeSeiolollilieS" :o)
long= Len(pass.s)-1
If long<longueur_pass
manque=(longueur_pass-long)-1
passwrd.s=pass.s
For y= 1 To manque
pos=Random(long,1)
passwrd.s=passwrd.s+Mid(pass.s,pos,1)
Next y
ProcedureReturn passwrd.s
Else
ProcedureReturn pass.s
EndIf
EndProcedure
Procedure.s Vigenere(txt.s,pass.s,mode)
; By Zorro
; ici j'utilise un alphabet tres classique, mais le mieux serai de melanger les lettres de l'alphabet
; pour ne pas rendre prévisible l'emplacement de telle ou telle lettre ;o)
; tout caractere n'etant pas dans l'alphabet , est utilisé telquel (je prends son code Ascii)
; j'ai Ajouté l'espace, pour ne pas avoir une découpe des mots qui aparaitrait dans le resultat codé :o)
Alphabet.s="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
sortie.s=""
If Len(pass.s)<Len(txt.s)
pass.s=rallonge_password(pass.s,Len(txt.s))
Else
pass.s=Left(pass.s,Len(txt.s))
EndIf
Select mode
Case 1 ; Action encodage
For p=1 To Len(txt.s)
car_clair=FindString(Alphabet.s,Mid(txt.s,p,1))
car_pass=FindString(Alphabet.s,Mid(pass.s,p,1))
car_encode=(car_clair+car_pass)
If car_encode >Len(Alphabet.s)
car_encode=car_encode-Len(Alphabet.s)
EndIf
If car_clair=0
sortie.s=sortie.s+Mid(txt.s,p,1)
Else
sortie.s=sortie.s+Mid(Alphabet.s,car_encode,1)
EndIf
Next p
Case 0 ; Action décodage
For p=1 To Len(txt.s)
car_clair=FindString(Alphabet.s,Mid(txt.s,p,1))
car_pass=FindString(Alphabet.s,Mid(pass.s,p,1))
car_decode=(car_clair-car_pass)
If car_decode<1:car_decode=Len(Alphabet.s)+car_decode :EndIf
If car_clair=0
sortie.s=sortie.s+Mid(txt.s,p,1)
Else
sortie.s=sortie.s+Mid(Alphabet.s,car_decode,1)
EndIf
Next p
EndSelect
ProcedureReturn sortie.s
EndProcedure
;
Procedure Recherche(Terme.s)
Co1=0
Foreach fiche() ; Parmis tout les elements de la liste
if findstring(Lcase(fiche()\nom.s),Lcase(Terme.s)) ; on recherche le Terme demandé
SetGadgetItemState(#liste,Co1,#true) ;- si present, on selectionne l'element de la listView correspondant
Endif
Co1=Co1+1
Next
EndProcedure
;
; Epb