Soyez le premier à donner votre avis sur cette source.
Vue 23 385 fois - Téléchargée 2 570 fois
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.
20 oct. 2006 à 19:32
un petit soft sympa et intéressant pour illustrer
quelques fontions même si l'expérience montre
qu'en matière de mot de passe, on utilise plutôt une méthode mnémotechnique qu'une solution aléatoire.
7/10
19 oct. 2006 à 15:07
sinon c'est quoi ça : "http://ami.informaticien@laposte.net" une adresse intermail ? ^^
19 oct. 2006 à 14:45
uses Math;
Ch := S[RandomRange(1,l+1)];
Random renvois un entier donc pas besoin de Round et pas besoin non plus d'une variable i pour stocker le nombre aleatoire. c'est pas vraiment utile ici.
de plus Random(l+1) renvois une valeur de 0..l+1 donc il y auras une exception si i = 0
puisqu'un string vas de 1..l, 0 etant logiquement l'octet qui sert a stocker la taille de la chaine quand on transtype en shortstring par exemple et vaut #0 dans le type string.
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.