password Generator (and keyring)

Share your advanced PureBasic knowledge/code with the community.
User avatar
dobro
Enthusiast
Enthusiast
Posts: 766
Joined: Sun Oct 31, 2004 10:54 am
Location: France
Contact:

password Generator (and keyring)

Post by dobro »

here is a digital key ring :)

PRG this may generate a password, desired length

we add a login
adding a name (eg the address of the site, forum or email linked to the password)
can Save the created profile

the [Password PRG] is used to create a general password
this will prevent the opening of the PRG by anyone
thus, a single PRG for all passwords
the passwords are saved in a file Encrypted
the general password is encrypted


; info: The password is generated with the content of the variable Ref.s (in Procedure.s password(longueur, level.i))
; you can put what you want as a character !! genre: ref.s = "01" for the Binary Pass or "aoieuy" to pass a vowel :)

in French
voici un porte clef numerique
ce prg peut, generer un password ,de longueur désiré
on y ajoute un login
on ajoute un nom (par exemple l'adresse du site, du forum ou de l'email lié au password)
on peut Sauvegarder la fiche créé

le bouton [Password prg] sert pour creer un password general
cela empechera l'ouverture du prg par n'importe qui


ainsi , un seul prg pour avoir tout les passwords
les passwords sont sauvé dans un fichier Crypté
le mot de passe general est aussi crypté

Image

the code :

Code: Select all

;***********************************************
;Titre  :*password_generator
;Auteur  : Dobro
;Date  :11/01/2016
;Heure  :16:53:16
;Version Purebasic :  PureBasic 5.30 (Windows - x86)
;Version de l'editeur :EPB V2.62
; Libairies necessaire : Aucune
; info : le password est generé avec le contenu de la cariable 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 encode_text(de,passwrd.s,message.s)
Declare.s decode_text(de,passwrd.s,message.s)
;{- Enumerations / DataSections
;{ Windows
Enumeration
	#Win
	#file
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Button_pass
  #Button_gen
  #Button_sauve
  #Button_edit
  #button_supr
  #Text_1
  #Text_2
  #String_nbr_car
  #String_level
  #Text_Auteur
  #String_out
  #liste
  #Text_login
  #String_Login
  #Text_pass
  #Text_titre
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="clef" ; 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= decode_text(8,clef.s,pass_gen.s)
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_pass
			pass_gen.s=InputRequester("Question","entrez un mot pass pour proteger vos données","",#PB_InputRequester_Password)
			pass_gen.s= Encode_text(8,CLef.s,pass_gen.s)
			OpenFile(#file,"pass.inf")
				WriteStringN(#file,pass_gen.s)
			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 du passwrd", "entrez un nom pour ce passwrd","")
			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 du passwrd", "entrez un nom pour ce passwrd", Resultat$)
				if nom_pass.s<>""
					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()
  If OpenWindow(#Win, 583, 160, 308, 390, "password_generator", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ;If CreateGadgetList(WindowID(#Win))
      ButtonGadget(#Button_pass, 215, 345, 85, 25, "password prg")
      ButtonGadget(#Button_gen, 215, 60, 85, 25, "Genere")
      ButtonGadget(#Button_sauve, 220, 150, 85, 25, "Sauve")
      ButtonGadget(#Button_edit, 220, 180, 85, 25, "Edit")
      ButtonGadget(#button_supr, 220, 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, 50, 20, "By Dobro")
      StringGadget(#String_out, 70, 120, 230, 20, "")	  
      ListViewGadget(#liste, 10, 145, 200, 220)
      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, 225, 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_ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789"; 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()
			nom.s=Encode_text(8,clef.s,fiche()\nom.s)
			WriteStringN(#file,nom.s)  ; ecrit le nom de la fiche
			Longueur1.s=Encode_text(8,clef.s,str(fiche()\Longueur.i))
			WriteStringN(#file,Longueur1.s); ecrit la longueur
			Level1.s =Encode_text(8,clef.s,str(fiche()\Level.i ))
			WriteStringN(#file,Level1.s ); ecrit le level 
			password1.s=Encode_text(8,clef.s,fiche()\password.s)
			WriteStringN(#file,password1.s) ; ecrit le password
			login1.s=Encode_text(8,clef.s,fiche()\login.s)
			WriteStringN(#file,login1.s) ; ecrit le password
		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 1 pour charger une fiche non crypté (ancien code ) 
				if charge_clair=1
					fiche()\nom.s=decode_text(8,clef.s,ReadString(#file))      ;lit le nom de la fiche
					fiche()\Longueur.i=val(decode_text(8,clef.s,ReadString(#file))); litla longueur
					fiche()\Level.i=val(decode_text(8,clef.s,ReadString(#file))); litle level 
					fiche()\password.s=decode_text(8,clef.s,ReadString(#file)) ; lit le password
					fiche()\login.s=decode_text(8,clef.s,ReadString(#file)) ; lit le login
				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					
				Endif
				
				; affiche dans la liste
				AddGadgetItem(#liste, compteur, fiche()\nom.s)
				compteur=compteur+1
			wend
		CloseFile(#file)
	Endif
EndProcedure
;
Procedure.s Encode_text(de,passwrd.s,message.s)
	; By Dobro
	; de=initialisation du randomseed
	; de2 = chaque lettre du mot de pass sert de generateur aleatoire
	pos_pass=1
	long_pass=len(passwrd.s)
	;ClearClipboard ()
	RandomSeed(de)
	chaine_codee$= ""
	;SetGadgetAttribute(#ProgressBar, #PB_ProgressBar_Maximum, Len(message.s))
	For position_caractere = 1 To Len(message.s)
		;SetGadgetState(#ProgressBar, position_caractere)
		;UpdateWindow_(GadgetID(#ProgressBar))
		Caractere$ = Mid(message.s, position_caractere, 1)
		car_pass$ = Mid(passwrd.s, pos_pass, 1)
		Caractere.c=asc(Caractere$)
		car_pass.c=asc(car_pass$)
		alea=random(8,1) ; ceci pourrai etre un parametre suplementaire dans l'interface
		code.c=(Caractere.c ! car_pass.c) +64
		code.c=code.c+alea
		; Respecte les retours a la ligne
		If Caractere.c=10
			code.c=10
		ElseIf Caractere.c=13
			Code.c=13
		Endif
		chaine_codee$=chaine_codee$+chr(code.c)
		pos_pass=pos_pass+1
		if pos_pass>long_pass
			pos_pass=1
		Endif
	Next position_caractere
	;SetGadgetState(#ProgressBar, 0)
	ProcedureReturn chaine_codee$ 
EndProcedure
Procedure.s Decode_text(de,passwrd.s,message.s)
	; By Dobro
	; de=initialisation du randomseed
	; de2 = chaque lettre du mot de pass sert de generateur aleatoire
	pos_pass=1
	long_pass=len(passwrd.s)
	;ClearClipboard()
	;;phrase$ = GetGadgetText(#Message)
	;SetGadgetAttribute(#ProgressBar, #PB_ProgressBar_Maximum, Len(message.s))
	;UpdateWindow_(GadgetID(#ProgressBar))
	;de = GetGadgetState(#spinseed)
	RandomSeed(de)
	;de2 = GetGadgetState(#spinrandom)
	For  position_caractere  = 1 To Len(message.s)
		;SetGadgetState(#ProgressBar,  position_caractere )
		;UpdateWindow_(GadgetID(#ProgressBar))
		Caractere$ = Mid(message.s, position_caractere, 1)
		car_pass$ = Mid(passwrd.s, pos_pass, 1)
		Caractere.c=asc(Caractere$)
		car_pass.c=asc(car_pass$)
		alea=random(8,1)
		if Caractere.c>13 
			Caractere.c=Caractere.c-alea
		Endif
		code.c=(Caractere.c ! car_pass.c) +64
		; Respecte les retours a la ligne
		If Caractere.c=10
			code.c=10
		ElseIf Caractere.c=13
			Code.c=13
		Endif
		chaine_decode.s= chaine_decode.s+chr(code.c)
		pos_pass=pos_pass+1
		if pos_pass>long_pass
			pos_pass=1
		Endif
	Next position_caractere
	;ClearGadgetItems(#editor)
	;SetGadgetState(#ProgressBar, 0)
	ProcedureReturn chaine_decode.s
EndProcedure
 
; Epb 

Image
Windows 98/7/10 - PB 5.42
■ sites : http://michel.dobro.free.fr/