29.10.2009, 12:32
|
Прохожий
|
|
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
|
|
а может кто делал такой шифр?
у меня что-то с дешифрацией не так... не правильно дешифрует
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
Button2: TButton;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Button3: TButton;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
P,G,X,K,M,a,b,Y,Mm:cardinal;
Form1: TForm1;
implementation
{$R *.dfm}
function get_random(in_v: integer; a0,m : integer) : integer overload;
begin
get_random := (a0 * in_v) mod (m);
end;
function Nod(z1,z2:integer):integer;
begin
while (z1<>0)and(z2<>0) do
if z1>z2 then z1:=z1 mod z2 else z2:=z2 mod z1;
if z1=0 then result:=z2 else result:=z1;
end;
procedure TForm1.Button2Click(Sender: TObject);
var nodel:integer;
begin
randomize;
P:=get_random (random(100), 6789, 123);
repeat
G:=get_random (random(50), 6789, 123);
until (P>G)and(G<>0);
//G:= 1 mod P;
nodel:=0;
repeat
X:=get_random (random(10), 678, 123);
nodel:=Nod((P-1),X);
until (nodel=1)and(X<P);
nodel:=0;
repeat
K:=get_random (random(10), 678, 123);
nodel:=Nod((P-1),K);
until (nodel=1)and(K>1)and(K<(P-1));
Edit1.Text:=inttostr(P);
Edit2.Text:=inttostr(G);
Edit3.Text:=inttostr(X);
Edit5.Text:=inttostr(K);
if ((P>G)and(X<P))and((K<(P-1))and(K>1)) then
begin
Y:=(Round(exp(X*ln(G)))) mod P;
Edit4.Text:=inttostr(Y);
end
else
messagebox(0, pchar('Вы ввели значения неправильно! P>G, X<P и 1<K<P-1'),pchar('ВНИМАНИЕ!'),mb_iconinformation+mb_ok);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Memo1.Lines.Text<>'' then
begin
Memo2.Clear;
Memo3.Clear;
M:=strtoint(Memo1.Text);
a:=(Round(exp(K*ln(G)))) mod P;
b:=(Round((exp(K*ln(Y))*M))) mod P;
Memo2.Lines.Add('a='+inttostr(a));
Memo2.Lines.Add('b='+inttostr(b));
Memo2.Lines.Add('('+inttostr(a)+','+inttostr(b)+')');
end
else
messagebox(0, pchar('Вы не ввели сообщение!'),pchar('ВНИМАНИЕ!'),mb_iconinformation+mb_ok);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Mm:=(round(exp(-X*ln(a))*b) mod P);
Memo3.Lines.Add(inttostr(Mm));
end;
end.
А какой в Delphi самый большой тип для целых чисел? а то постоянно получается Floating point overflow.. вроде как деления на 0 нет...
Последний раз редактировалось Athen, 29.10.2009 в 19:52.
|