Générateur de mot de passe

Description

--> Générateur de mots de passes
--------------------------------

Cette application permet de générer des mots de passe de
manière aléatoire avec ou sans contraintes.

Pour être clair, il s'agit d'une application pour ceux qui
sont à cours d'idées pour imaginer leurs nouveaux mots de
passe, et non d'un outil pour crackers..

Je ne porte aucune responsabilité sur les conséquences de
l'utilisation de cette application.

Le but est d'illustrer plusieurs principes de programmation
en Delphi, dont:

- l'utilisation du générateur de nombres aléatoires
- la conversion de nombres en chaînes et inversement
- la copie dans le presse-papiers de Windows

--> Olivier

Source / Exemple :


unit Unit1;

{
Générateur de mot de passe.
Olivier - Juillet 2006
Ce petit programme est réalisé dans le cadre d'un exercice de programmation
en Delphi.
Il illustre l'emploi du générateur aléatoire, de manipulation de chaînes
de caractères, de combinaison de condition logiques, etc.
}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, IniFiles, Menus, ExtCtrls, jpeg;

type
  TForm1 = class(TForm)
	 GroupBox1: TGroupBox;
	 ChkMin: TCheckBox;
	 ChkMaj: TCheckBox;
	 ChkChiffres: TCheckBox;
	 Label1: TLabel;
	 EdNombre: TEdit;
	 UpDown1: TUpDown;
	 Label2: TLabel;
	 EdPrefixe: TEdit;
	 BtnGenerer: TButton;
	 EdMdP: TEdit;
	 BtnCopier: TButton;
	 Label4: TLabel;
	 MainMenu1: TMainMenu;
	 Fichier1: TMenuItem;
	 Quitter1: TMenuItem;
	 Edition1: TMenuItem;
	 Copier: TMenuItem;
	 BtnEnr: TButton;
	 Label3: TLabel;
	 Enregistrer1: TMenuItem;
	 N1: TMenuItem;
	 SaveDialog1: TSaveDialog;
	 ChkNoRepet: TCheckBox;
    Aide1: TMenuItem;
    Apropos1: TMenuItem;
    ImgLogo1: TImage;
	 procedure BtnGenererClick(Sender: TObject);
	 procedure FormCreate(Sender: TObject);
	 procedure BtnCopierClick(Sender: TObject);
	 procedure EdMdPChange(Sender: TObject);
	 procedure Quitter1Click(Sender: TObject);
	 procedure Enregistrer1Click(Sender: TObject);
	 procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Apropos1Click(Sender: TObject);
  private
	 { Déclarations privées }
  public
	 { Déclarations publiques }
  end;

var
  Form1: TForm1;
  INI: TIniFile;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
	{ouverture du programme}
	{lecture des paramètres (s'il y en a)
	On ouvre un fichier de même nom que l'application, mais d'extension .ini
	S'il n'existe pas, il est ignoré et les options auront
	des valeurs par défaut}
	Ini := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
	ChkMaj.Checked := Ini.ReadBool('Options','Maj', False);
	ChkMin.Checked := Ini.ReadBool('Options','Min', True);
	ChkChiffres.Checked := Ini.ReadBool('Options','Chiffres', True);
	ChkNoRepet.Checked := Ini.ReadBool('Options','NoRepet', False);
	UpDown1.Position := Ini.ReadInteger('Options','Nombre', 6);
	EdPrefixe.Text := Ini.ReadString('Options','Prefixe', '');
	SaveDialog1.FileName := Ini.ReadString('Options','Fichier', '');
	Ini.Free;	{fermeture du fichier INI}
	Randomize; // Réinitialisation de la suite pseudo-aléatoire
end;

procedure TForm1.BtnGenererClick(Sender: TObject);
{Cette procédure est exécutée par un clic sur le bouton Générer}
const
	TabCarNum = '0123456789';                    // tous les chiffres
	TabCarMin = 'abcdefghijklmnopqrstuvwxyz';    // toutes les lettres minuscules
	TabCarmaj = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';    // toutes les lettres majuscules
var
	Ch: Char;
	S: string;
	i, n, l : integer;
begin
	{au départ, on recopie le préfixe obligatoire dans le champ texte
	 qui reçoit le mot de passe}
	EdMdP.Text := EdPrefixe.Text;
	n := 0;
	if UpDown1.Position > 0 then
		{le nombre de caractères requis est indiqué dans le contrôle UpDown}
		n := UpDown1.Position;
	{S est la chaîne de caractères dans laquelle le tirage sera fait
	Elle est constituée d'une suite de chiffres, de majuscules et de
	minuscules, selon les options choisies}
	S := '';
	if ChkChiffres.Checked then
		S := S + TabCarNum;
	if ChkMin.Checked then
		S := S + TabCarMin;
	if ChkMaj.Checked then
		S := S + TabCarMaj;
	l := Length(S);  {longueur de S, pour plage du choix aléatoire}
	if l = 0 then begin
		MessageDlg('Veuillez choisir des chiffres et/ou des lettres',
     mtInformation, [mbOK], 0);
		exit;
	end;
	{on éxécute la boucle de choix aléatoire jusqu'à ce que le champ
	texte du mot de passe contienne le nombre de caractères voulu}
	while Length(EdMdP.Text) < n do begin
		{On choisit un chiffre entre 1 et la longueur de S}
		i := Round(Random(l+1));
		{On récupère le caractère situé à cette position dans S}
		Ch := S[i];
		if ChkNoRepet.Checked and (n < l) then begin
			{Si on interdit la répétition, il faut refaire le choix
			 tant que Ch figure déjà dans le mot de passe.
			 ATTENTION: cela n'est logique que si le nombre de caractères
			 demandé pour le mot de passe (n) est inférieur au nombre
			 de caractères constituant S (l); dans le cas contraire,
			 cette option est sans effet}
			while Pos(Ch, EdMdp.Text) > 0 do begin
				i := Round(Random(l+1));
				Ch := S[i];
			end;
		end;
		{enfin, on ajoute le caractère aléatoire directement dans le
		champ de texte recevant le mot de passe}
		EdMdP.Text := EdMdP.Text + Ch;
	end;
end;

procedure TForm1.EdMdPChange(Sender: TObject);
begin
	{cet événement est généré à chaque changement du contenu du champ
	texte du mot de passe. On en profite pour rendre accessibles les
	boutons et commandes de menu nécessaires à l'utilisation du résultat}
	BtnCopier.Enabled := (Length(EdMdp.Text) > 0);
	Copier.Enabled := BtnCopier.Enabled;
	Enregistrer1.Enabled := BtnCopier.Enabled;
	BtnEnr.Enabled := BtnCopier.Enabled;
end;

procedure TForm1.BtnCopierClick(Sender: TObject);
begin
	{cette commande envoye le mot de passe dans le presse-papier de Windows
	equivaut à Edition, Copier}
	if EdMdP.Text <> '' then begin
		EdMdP.SelectAll;
		EdMdP.CopyToClipboard;
		MessageDlg('Le mot de passe ci-dessus est copié dans le presse-'
		+ 'papiers. Vous pouvez le récupérer par une commande Coller '
		+ 'dans un autre logiciel', mtInformation, [mbOK], 0);
	end;
end;

procedure TForm1.Quitter1Click(Sender: TObject);
begin
	Close;
end;

procedure TForm1.Enregistrer1Click(Sender: TObject);
var
	s, nf: string;
	f: TextFile;
	bAppend: boolean;
	Delim: char;
begin
	{Pour enregistrer le mot de passe en l'associant à un utilisateur}
	s := '';
	{Afficher une boîte de dialogue pour demander un nom d'utilisateur}
	if InputQuery('Enregistrement',
	'Associer le mot de passe à l''utilisateur:', s) then begin
		{Si l'utilisateur a cliqué sur OK, on arrive ici}
		if s = '' then
			exit; {chaîne vide, non valable}
		{Demander dans que fichier (boîte de dialogue standard)}
		if SaveDialog1.Execute then begin
			if SaveDialog1.FileName = '' then exit;
			nf := SaveDialog1.FileName; {nom complet du fichier}
			{on peut choisir entre CSV et TXT}
			if LowerCase(ExtractFileExt(nf)) = '.csv' then
				{en CSV, une virgule comme délimiteur de champs}
				Delim := ','
			else
				{sinon, une tabulation}
				delim := #9;
			s := s + Delim + EdMDP.Text;
			bAppend := False;
			if FileExists(nf) then
				{si le fichier choisi existe, on ajoute l'enregistrement
				 à la suite}
				bAppend := True;
			AssignFile(F, nf);
			{$I-}
			if bAppend then
				Append(F)   {mode ajout}
			else
				Rewrite(F); {créer le fichier}
			{$I+}
			if IOResult <> 0 then begin
				MessageDlg('Impossible d''enregistrer dans le fichier '
         + nf, mtWarning, [mbOK], 0);
				exit;
			end;
			{écriture de la chaîne S dans le fichier}
			WriteLn(F, S);
			{fermeture du fichier}
			CloseFile(F);
		end;
	end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
	{fermeture du programme, enregistrement des paramètres}
	Ini := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
	try
	Ini.WriteBool('Options','Maj', ChkMaj.Checked);
	Ini.WriteBool('Options','Min', ChkMin.Checked);
	Ini.WriteBool('Options','Chiffres', ChkChiffres.Checked);
	Ini.WriteBool('Options','NoRepet', ChkNoRepet.Checked);
	Ini.WriteInteger('Options','Nombre', UpDown1.Position);
	Ini.WriteString('Options','Prefixe', EdPrefixe.Text);
	Ini.WriteString('Options','Fichier', SaveDialog1.FileName);
	finally
	Ini.Free;
	end;
end;

procedure TForm1.Apropos1Click(Sender: TObject);
begin
	MessageDlg
  ('Programme réalisé en Delphi 5 par Olivier - Juillet 2006'
	+ #13#10 + 'http://ami.informaticien@laposte.net' , mtInformation, [mbOK], 0);
end;
 end.

Conclusion :


Il est possible avec cette application: de générer des MDP (avec vos préférences), de le copier, de le sauver via le presse papier. Utilisation des fichiers: .ini, .local.

En esperant que ça intéressera certains. A bientôt. Olivier

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.