|
#1
|
||||
|
||||
Шифратор
Всем доброго времени суток.
Помогите пожалуйста. Есть программа на Delphi 7- шифратор простой замены(алфавит подбирается случайно). Его нужно сделать трехступеньчатым. То есть на втором шаге, он изменяет уже созданный новый алфавит на введенный мной, после чего он смещает его, на 3 символа вправо. Но как создать такой алгоритм я не смогла додуматься. Надеюсь на вашу помощь) Код:
unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFrm = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Button2: TButton; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Button3: TButton; Button4: TButton; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Edit3KeyPress(Sender: TObject; var Key: Char); procedure FormShow(Sender: TObject); procedure Edit4KeyPress(Sender: TObject; var Key: Char); procedure Edit5KeyPress(Sender: TObject; var Key: Char); procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Massiv(); procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end; const n=32; var Frm: TFrm; k1,k2,b: integer; mas1: array [1..n] of char = ('а','б','в','г','д','е','ж','з','и','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я','_'); mas3: array [1..n] of char = ('ц','у','к','е','н','г','ш','щ','з','х','ъ','ф','ы','в','а','п','р','о','л','д','ж','э','я','ч','с','_','м','и','т','ь','б','ю'); mas2: array [1..n] of char; implementation {$R *.dfm} procedure TFrm.FormClose(Sender: TObject; var Action: TCloseAction); begin Application.Terminate; end; procedure Control(var ch:char; var l:TEdit); begin case ch of '0'..'9':; #8:; else ch:=#0; end; end; procedure TFrm.Massiv(); var i,j,r:integer; label gt; begin j:=1; i:=j; Randomize; while i<=n do begin label7.Caption:=label7.Caption + mas1[i]; inc(i); end; while j<=n+1 do begin gt: i:=random(n)+1; for r:=1 to j-1 do if mas2[r]<>mas1[i] then mas2[j]:=mas1[i] else goto gt; label9.Caption:=label9.Caption + mas2[j]; inc(j); end; end; procedure TFrm.Edit3KeyPress(Sender: TObject; var Key: Char); begin if key=#13 then Edit4.SetFocus; Control(key, Edit3); end; procedure TFrm.FormShow(Sender: TObject); begin Edit3.SetFocus; Massiv; end; procedure TFrm.Edit4KeyPress(Sender: TObject; var Key: Char); begin if key=#13 then Edit5.SetFocus; Control(key, Edit4); end; procedure TFrm.Edit5KeyPress(Sender: TObject; var Key: Char); begin if key=#13 then Edit1.SetFocus; Control(key, Edit5); end; procedure TFrm.Edit1KeyPress(Sender: TObject; var Key: Char); begin case key of 'а'..'я':; 'ё':; '_':; #8:; else key:=#0; end; if key=#13 then Edit2.SetFocus; end; procedure TFrm.Button3Click(Sender: TObject); begin Label7.Caption:=''; Label9.Caption:=''; Massiv; end; procedure TFrm.Button1Click(Sender: TObject); label l; var f,i,j,d,z:integer; begin Edit2.Text:=''; try if (edit1.Text='') or (edit3.Text='') or (edit4.Text='') or (edit5.Text='') then begin ShowMessage('Заполните все поля'); exit; end; f:=0; if (StrToInt(Edit3.Text) mod 2 = 0) and (StrToInt(Edit4.Text) mod 2 = 0) then begin ShowMessage('Коэффициенты должны быть нечётными!'); Edit3.Text:=''; Edit4.Text:=''; Edit3.SetFocus; f:=1; end; if (StrToInt(Edit3.Text) mod 2 = 0) then begin ShowMessage('Коэффициенты должны быть нечётными!'); f:=2; Edit3.SetFocus; Edit3.Text:=''; end; if (StrToInt(Edit4.Text) mod 2 = 0) then begin ShowMessage('Коэффициенты должны быть нечётными!'); f:=3; Edit4.SetFocus; Edit4.Text:=''; end; if Edit5.Text = '' then begin ShowMessage('Введите b!'); Edit5.SetFocus; end; k1:=StrToInt(Edit3.Text); k2:=StrToInt(Edit4.Text); b:=StrToInt(Edit5.Text); z:=1; for d:= 1 to Length(Edit1.Text) do begin for i:=1 to n do if Edit1.Text[d] = mas1[i] then begin j:=(k1*i+k2) mod n; if j=0 then j:=n; Edit2.Text:=Edit2.Text + mas2[j]; if d mod b = 0 then Edit2.Text:=Edit2.Text + '_'; end; for z:=1 to n do if Edit2.Text=Edit2.Text + mas2[j] then begin j:=(k1*z*k2) mod n; if j=0 then j:=n; Edit2.Text:=Edit2.Text + mas3[j]; end; end; except on EConvertError do begin if (f=1) or (f=2) or (f=3) then exit; MessageDlg('Там пусто!', mtWarning,[mbok],0); if Edit3.Text='' then Edit3.SetFocus; if Edit4.Text='' then Edit4.SetFocus; if (Edit3.Text='') and (Edit4.Text='') then Edit3.SetFocus; end; end; Edit1.Text:=''; end; procedure TFrm.Button4Click(Sender: TObject); begin Edit1.Text:=''; Edit2.Text:=''; end; procedure TFrm.Button2Click(Sender: TObject); var d,t,g,e,o:integer; st:string; begin if (edit2.Text='') or (edit3.Text='') or (edit4.Text='') or (edit5.Text='') then begin ShowMessage('Заполните все поля'); exit; end; t:=0; st:=Edit2.Text; for g:=1 to length(st) do if t=b then begin t:=1; delete (st, g ,1); end else t:=t+1; for d:=1 to length(st) do begin for o:=1 to n do begin e:=(k1*o+k2) mod n; if e=0 then e:=n; if st[d]=mas2[e] then Edit1.Text:=Edit1.Text+mas1[o]; end; end; end; end. |
#2
|
||||
|
||||
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject); var i: integer; s: string; begin s:= Edit1.Text; for i := 1 to Length(s) do if byte(s[i])<=252 then byte(s[i]):= byte(s[i])+3; Edit1.Text:= s; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |