Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как написать генератор паролей

Delphi , Синтаксис , Пароли

Как написать генератор паролей

Автор: Barracuda

Призвали как-то одного волосатого админа в армию служить, на границу. Поставили его в дозор. Вдруг админ слышит шаги...
- Стой! Пароль!...
ответ из темноты:
- Владивосток...
- Логин ...
- ????!!!......

Hi всем! Начнём с того что кинем на форму три Edit -а , Батон (Button), два GroopBox-a , popUp меню и UpDown. На одну панель бросаем три RadioButton-a, на другую три CheckBox-a. Ассоциируем UpDown с первым Edit-ом, здесь будет выбор кол-ва букв в пароле. Второй Edit будет для вывода пароля, а третий для побуквенного вывода сгенереного пароля. CheckBox-ы называем C1,C2,C3,C4,C5. RadioButton-ы называем Ra1,Ra2,Ra3. В меню делаем два пункта, их каптионы называем +10 и -10. Caption-ы CheckBox-ов обзываем 'Латиница','Кирилица','0..9','Спецсимволы ' и 'Смесь'. Это для выбора символов из которых генерится пароль. Caption-ы RadioButton-ов обзываем 'Upper Case' 'Lower Case' 'Misc' -для выбора регистра. Один CheckBox и RadioButton делаем выделеными по умолчанию. Батон используем как стартовую кнопку. А дальше смотрите код:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, ExtCtrls, Menus, ComCtrls, Buttons;

type
  TForm1 = class(TForm)
    Gen: TButton;
    Label1: TLabel;
    Status: TStatusBar;
    PopupMenu2: TPopupMenu;
    N101: TMenuItem;
    N102: TMenuItem;
    edit2: TEdit;
    edit3: TEdit;
    edit1: TMemo;
    U1: TUpDown;
    C1: TCheckBox;
    C2: TCheckBox;
    C3: TCheckBox;
    C4: TCheckBox;
    C5: TCheckBox;
    Ra1: TRadioButton;
    Ra2: TRadioButton;
    Ra3: TRadioButton;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    procedure GenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N101Click(Sender: TObject); {Обработка пунктов меню}
    procedure N102Click(Sender: TObject); {Обработка пунктов меню}
    procedure SpinKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
end;

var
  Form1: TForm1;
  kol: integer;
  ss: string;

implementation

{$R *.DFM}

procedure TForm1.GenClick(Sender: TObject);
label
  1;
const
  con1='qwertyuiopasdfghjklzxcvbnm';
  con2='QWERTYUIOPASDFGHJKLZXCVBNM';
  con3='qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
  con4='!@#$%^&*()_+|\=-<>.,/?''; :"][}{';
  con5='йцукенгшщзхъфывапролджэячсмитьбю';
  con6='ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ';
  con7='йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ';
var
  s: string;
  r, m, k, l: integer;
begin
  randomize;
  if edit1.text<>'' then
    kol:=strtoint(edit1.text)
  else
  begin
    goto 1;
  end;
  begin
    edit2.text:='Введите значение...';
  end;
  edit3.clear; status.simpletext:='Подождите, пароль генерируется...';
  repeat
    r:=random(8)+1;
    if kol>0 then
      if (c1.Checked=true) or (c2.Checked=true) or
      (c3.Checked=true) or (c4.Checked=true) then
        case r of
          1:if (c2.Checked=true) and (ra1.Checked=true) then
              s:=s+con1[random(25)+1];
          2:if (c2.Checked=true) and (ra2.Checked=true) then
              s:=s+con2[random(25)+1];
          3:if (c2.Checked=true) and (ra3.Checked=true) then
              s:=s+con3[random(49)+1];

          4:if c4.Checked=true then
              s:=s+con4[random(30)+1];
          5:if c1.Checked=true then
              s:=s+inttostr(random(10));

          6:if (c3.Checked=true) and (ra1.Checked=true) then
              s:=s+con5[random(31)+1];
          7:if (c3.Checked=true) and (ra2.Checked=true) then
              s:=s+con6[random(31)+1];
          8:if (c3.Checked=true) and (ra3.Checked=true) then
              s:=s+con7[random(63)+1];
        end
    else
    begin
      s:='Выберите символы которые вы хотите использовать';
      kol:=length(s);
    end;
  until
    length(s)>=kol;
  while length(s)>kol do
    delete(s,1,1);

  1:
  if edit1.text='' then
  begin
    s:='Выберите кол-во символов в пароле!';
    kol:=length(s);
    status.simpletext:='Выберите кол-во символов в пароле!';
    edit2.text:=s;
    edit3.text:= 'Выберите кол-во символов в пароле!';
  end
  else
  begin
    edit2.text:=s;
    for m:=1 to kol do
      edit3.text:=edit3.text+' '+s[m];
  status.simpletext:='Пароль готов!';
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  edit2.clear;edit3.clear;
  edit2.text:='Здесь будет пароль!';
  u1.position:=8;
  edit3.text:='А здесь каждый символ отдельно!'; kol:=0;
end;

procedure TForm1.N101Click(Sender: TObject);
begin
  u1.position:=u1.position+10
end;

procedure TForm1.N102Click(Sender: TObject);
begin
  if u1.position>10 then
    u1.position:=u1.position-10
  else
    status.simpletext:='Слишком маленькое значение!!!';
end;

procedure TForm1.SpinKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
  if (key=13) then genclick(gen) ;
end;

procedure TForm1.edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (key in ['0'..'9']) then key:=#0;
end; 

end.

Ну всё, Удачи...

Here is a translation of the content into Russian:

Пароль-генератор!

Код, предоставленный в этом примере, - это приложение Delphi, генерирующее пароли на основе ввода пользователя. Оно имеет несколько функций:

  1. Три текстовых поля: одно для отображения сгенерированного пароля, второе для отображения пароля в виде отдельных символов и третье для ввода количества символов для генерации.
  2. Кнопка для начала генерации пароля.
  3. Пять чекбоксов для выбора наборов символов (латиница, кириллица, цифры 0-9, спецсимволы или смесь).
  4. Три радиobuttons для выбора чувствительности регистра (верхний, нижний или смешанный).
  5. Управление шагом для изменения количества символов в пароле.
  6. Меню с двумя пунктами для увеличения или уменьшения количества символов на 10.

Код хорошо организован и легко понятен. Однако есть несколько предложений по улучшению:

  1. Вызов randomize должен быть перемещен за пределы процедуры GenClick, чтобы он выполнялся только один раз при создании формы.
  2. Код использует метки goto, которые в целом считаются плохой практикой в программировании Delphi. Вместо этого, используйте простой цикл или рекурсию для повторения процесса генерации пароля до достижения желаемой длины.
  3. Процесс генерации пароля можно оптимизировать, используя одиночный цикл вместо множества case-заявлений.
  4. Пункты меню и радиobuttons должны иметь более описательные заголовки, чтобы помочь пользователям понять их функции.

Вот обновленная версия кода с этими предложениями реализованными:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Spin, ExtCtrls, Menus, ComCtrls, Buttons;

type
  TForm1 = class(TForm)
    Gen: TButton;
    Label1: TLabel;
    Status: TStatusBar;
    PopupMenu2: TPopupMenu;
    N101: TMenuItem;
    N102: TMenuItem;
    edit2: TEdit;
    edit3: TEdit;
    edit1: TMemo;
    U1: TUpDown;
    C1: TCheckBox;
    C2: TCheckBox;
    C3: TCheckBox;
    C4: TCheckBox;
    C5: TCheckBox;
    Ra1: TRadioButton;
    Ra2: TRadioButton;
    Ra3: TRadioButton;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;

    procedure GenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N101Click(Sender: TObject);
    procedure N102Click(Sender: TObject);
    procedure SpinKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure edit1KeyPress(Sender: TObject; var Key: Char);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  kol: integer;
  ss: string;

implementation

{$R *.DFM}

procedure TForm1.GenClick(Sender: TObject);
begin
  if edit1.text <> '' then
    kol := StrToInt(edit1.text)
  else
  begin
    kol := 0;
  end;

  s := '';
  repeat
    r := Random(8) + 1;
    case r of
      1:
        if C2.Checked and Ra1.Checked then
          s := s + con1[Random(25) + 1];
      2:
        if C2.Checked and Ra2.Checked then
          s := s + con2[Random(25) + 1];
      3:
        if C2.Checked and Ra3.Checked then
          s := s + con3[Random(49) + 1];

      4:
        if C4.Checked then
          s := s + con4[Random(30) + 1];
      5:
        if C1.Checked then
          s := s + IntToStr(Random(10));

      6:
        if C3.Checked and Ra1.Checked then
          s := s + con5[Random(31) + 1];
      7:
        if C3.Checked and Ra2.Checked then
          s := s + con6[Random(31) + 1];
      8:
        if C3.Checked and Ra3.Checked then
          s := s + con7[Random(63) + 1];
    end;
  until Length(s) >= kol;

  while Length(s) > kol do
    Delete(s, 1, 1);

  edit2.text := s;
  for m := 1 to kol do
    edit3.text := edit3.text + ' ' + s[m];

  status.simpletext := 'Пароль готов!';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  edit2.clear;
  edit3.clear;
  edit2.text := 'Здесь будет пароль!';
  u1.position := 8;
  edit3.text := 'А здесь каждый символ отдельно!';
  kol := 0;
  Randomize;
end;

procedure TForm1.N101Click(Sender: TObject);
begin
  u1.position := u1.position + 10;
end;

procedure TForm1.N102Click(Sender: TObject);
begin
  if u1.position > 10 then
    u1.position := u1.position - 10
  else
    status.simpletext := 'Слишком маленькое значение!!!';
end;

procedure TForm1.SpinKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (key = 13) then GenClick(Gen); end;
end;

procedure TForm1.edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9']) then key := #0;
end;

end.

Обратите внимание, что я также добавил более описательные заголовки для пунктов меню и радиobuttons, чтобы помочь пользователям понять их функции.

Как написать генератор паролей на Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Пароли ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 01:07:35/0.004539966583252/0