GÉNÉRATEUR DE MOTS DE PASSE ALÉATOIRES

John Dogget Messages postés 384 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 7 mai 2009 - 10 avril 2006 à 01:31
ftone Messages postés 1 Date d'inscription samedi 14 avril 2007 Statut Membre Dernière intervention 14 avril 2007 - 14 avril 2007 à 11:55
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/36977-generateur-de-mots-de-passe-aleatoires

ftone Messages postés 1 Date d'inscription samedi 14 avril 2007 Statut Membre Dernière intervention 14 avril 2007
14 avril 2007 à 11:55
bonjour à tous et toutes, j ai téléchargé le generateur mais je ne sais pas l'utiliser.
je suis completement novice dans l'excution d'un programme .
c'est un ami qui m'a donné votre adresse suite aux piratages de mes boites mails.
pouvez vous m'indiquer la marche à suivre.
merci d'avance
kiki917 Messages postés 1 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 18 juillet 2006
18 juil. 2006 à 13:11
bonjour, je débute en informatique, j'ai tléchargé le zip, et jlé décompréssé mai je ne c pa se ke je doi faire ensuite :s help please
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 34
24 avril 2006 à 14:22
aucune difference de performance entre les deux. car voici l'interpretation assembleur des deux :

mais un peu plus d'instruction pour repeat vus qu'il faut tester avant d'entrer dans la condition.

function LoopWhile(X,Min,Max : integer) : boolean;
begin
result := (X >= Min) and (X <= Max);
while result do begin
inc(X);
result := (X >= Min) and (X <= Max);
end;
end;

function LoopWhile(X: Integer; Min: Integer; Max: Integer): Boolean;
asm
@@0: push ebx
@@1: cmp edx, eax
@@3: jnle @@9
@@5: cmp ecx, eax
@@7: jnl @@13
@@9: xor ebx, ebx
@@11: jmp @@32
@@13: mov bl, $01
@@15: jmp @@32
@@17: inc eax
@@18: cmp edx, eax
@@20: jnle @@26
@@22: cmp ecx, eax
@@24: jnl @@30
@@26: xor ebx, ebx
@@28: jmp @@32
@@30: mov bl, $01
@@32: test bl, bl
@@34: jnz @@17
@@36: mov eax, ebx
@@38: pop ebx
end;


function LoopRepeat(X,Min,Max : integer) : boolean;
begin
result := (X >= Min) and (X <= Max);
if result then
repeat
inc(X);
result := (X >= Min) and (X <= Max);
until not result;
end;

function LoopRepeat(X: Integer; Min: Integer; Max: Integer): Boolean;
asm
@@0: push esi
@@1: mov esi, ecx
@@3: cmp edx, eax
@@5: jnle @@11
@@7: cmp esi, eax
@@9: jnl @@15
@@11: xor ecx, ecx
@@13: jmp @@17
@@15: mov cl, $01
@@17: test cl, cl
@@19: jz @@40
@@21: inc eax
@@22: cmp edx, eax
@@24: jnle @@30
@@26: cmp esi, eax
@@28: jnl @@34
@@30: xor ecx, ecx
@@32: jmp @@36
@@34: mov cl, $01
@@36: test cl, cl
@@38: jnz @@21
@@40: mov eax, ecx
@@42: pop esi
end;
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
16 avril 2006 à 14:50
Merci FoXI pour toutes ses précisions. Je ferai gaffe à l'avenir, et il est vrai qu'il m'arrive d'utiliser While comme le Repeat..Until sans me poser de questions.
A l'avenir je devrai me méfier des conséquences du à ce genre de petits details plus souvent.

Sinon en terme de performance (calcul machine), sais tu s'il y à une différence entre un While et un Repeat ?
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 34
14 avril 2006 à 02:41
petite recommandation a elguevel, ne plus utiliser Repeat Until mais plutot While ... do

la boucle "Repeat until" execute au moins une fois l'instruction qu'elle contient, meme si la condition est fausse, ce qui peu provoquer des erreurs inattendues.

la boucle "While do" n'execute pas l'instruction qu'elle contient si la condition est fausse.

exemple :

result := '';
x := 1;
repeat
result := result + S[x];
inc(x);
until X > length(S);

erreur si S est vide (length(S) = 0), l'instruction serat executée au moins une fois, la condition ne peu que faire sortir de la boucle APRES l'instruction mais ne protege pas son accés.

result := '';
x := 1;
while X <= length(s) do begin
result := result + s[x];
inc(x);
end;

aucune erreur si S est vide (length(S) = 0), car la condition fausse empecheras d'aller a l'interieur de la boucle et egalement elle permet d'en sortir AVANT l'instruction.

pour obtenir un comportement similaire avec "Repeat Until" il faudrait tester avant la boucle la condition :

result := '';
x := 1;
if X <= Length(S) then
repeat
result := result + S[x];
inc(x);
until X > length(S);

while ne necessite donc pas de controller la condition avant son appel, ce qui est plus rapide et plus securisant.

d'une maniere plus generale, "Repeat Until" viens du monde du Pascal et tout comme le type "Object", on doit se mefier et bien reflechir avant son utilisation, voir ne pas les utiliser du tout.
Repeat Until serat donc remplacée systematiquement par While Do
et Object serat remplacé systematiquement par une Classe.

et dans le code, l'instruction While permet de connaitre immediatement la condition a respecter alors qu'avec repeat until il faudrat descendre dans le code pour connaitre cette fameuse condition, ce qui n'en facilite pas la lecture.

il faut donc oublier les conventions du Turbo Pascal au profit des conventions du Pascal Objet.
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
13 avril 2006 à 08:11
L'avantage du KeyPress dans ce cas là c'est que l'utilisateur n'a pas le choix, et de plus çà evite d'avoir à géré des exception et de les afficher systématiquement en cas de problème. Enfin je trouve çà plus propre.

PS : Tu peux utiliser la propriété "MaxLength" de TEdit aussi pour forcer l'utilisateur à ne pas entrer autant de caractères qu'il veut.

Pour les noms de compo, j'avoue que c plus simple de pas avoir a les retoucher, mais bon sur des programmes conséquents, vous mieux etre explicit.

Sinon j'ai pas dit que mon algo etait bien lol, j'ai fait çà main lever, c'etait juste histoire de dire que çà aurait été mieux de passer les checkBox en paramètres plutôt que les avoir intégrées dans ta fonction proprietaire. En plus avec le passage de paramètre ta fonction devient portable d'un programme à l'autre :-)


Allé bon Coding, @+
John Dogget Messages postés 384 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 7 mai 2009
12 avril 2006 à 19:25
Salut :)

- le try except est une autre manière de procéder, je ne savais pas jusqu'alors me servir de KeyPressed comme tu le fait
- pour les noms sur les compo, j'admets que c'est une mauvaise habitude et que ça facilite la compréhension générale de la source, mais moi ça me gêne pas (je dis pas que c'est bien hein :D !)
- j'ai fait une fonction séparé pour générer le MDP mais c'est vrai que j'ai pas pensé à la rendre completement indépendante du reste, c'est une faute d'inattention :S

Par contre, je trouve mon algo pour trouver les caractères du MDP plus efficace que le tien :p ...
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
12 avril 2006 à 13:54
Programme simple et pratique.

Mais ...

+ Dans l'evenement "KeyPressed" de "Edit1" ajoute : if not (Key in #13, '0'..'9') then Key := #0;
çà te permettera de te passer du Try..except..end; de l'evenement BitBtn1Click, en n'autorisant que l'entré de chiffre !

+ Donne des noms à tes composants : Edit1, RichEdit1, CheckBox1, etc...

+ Et j'aurai fait une fonction séparer pour la géneration de mots de passe : (tient je suis gentil je te fait un exemple)

-------------------------
function TForm1.GenererMDP( longeur : integer; lettremin : boolean; lettremaj : boolean; numerique : boolean) : string;
var
temp : string;
begin

temp := '';

if ( not lettremin ) and ( not lettremaj ) and ( not numerique ) Then
begin
MessageBoxA( Handle, PChar('Veuillez cocher au moins un type ...'), PChar('Type manquant'), MB_ICONINFORMATION );
Exit;
end;

while Length(Temp) < longeur do
begin
if ( lettremin = true ) and ( Length(Temp) < longeur ) then temp := temp + Chr(RandomCorrige(97,122));
if ( lettremaj = true ) and ( Length(Temp) < longeur ) then temp := temp + Chr(RandomCorrige(65,90));
if ( numerique = true ) and ( Length(Temp) < longeur ) then temp := temp + Chr(RandomCorrige(48,57));
end;

Result := Temp;

end;
-------------------------

et ta plus qu'a faire :

Randomize;
RichEdit1.Clear;
RichEdit1.Lines.Add( GenereMDP( StrToInt(Edit1.Text), CheckBox3.Checked, CheckBox2.Checked, CheckBox1.Checked ) );

Pour afficher le resultat (tu fait un repeat..until si tu veux une liste)

Voila, J'tai mis 8/10.

++ ;-)
John Dogget Messages postés 384 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 7 mai 2009
11 avril 2006 à 19:25
Merci de cette critique constructive ...

Bien vu pour le RandomRange, je n'etais pas au courant.
Heureusement, c'est simplissime à corriger :).

Pour les répétitions, ça deviens un peu plus delicat, en particulier sur les très longues clés où proportionnelement une répétition sera très probable ...
John Dogget Messages postés 384 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 7 mai 2009
11 avril 2006 à 18:39
Pinèze !

Quand vous laissez une note, j'aimerais bien que vous laissiez un pti commentaires : ce qui va pas, ce qui vous a plus ...

Allez siouplet, un ptit effort :)
John Dogget Messages postés 384 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 7 mai 2009
10 avril 2006 à 01:31
LoOl

Je vois que j'ai récolté 1/10 !

Merci à vous ...
Rejoignez-nous