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