Нужна помощь по шифру RSA
Всем привет! У меня есть программа, реализующая атаку бесключевым чтением РСА, но она работает только для небольших чисел(относительно ключей, которые необходимы). Возможно ли в этот код как-то, внедрить например, модули от FGint, чтобы все работало? Придется ли полностью переписывать сами процедуры зашифрования/расшифрования и т.д.? Это для диплома, тема - исследование стойкости рса в зависимости от длины ключей. Сильно не срамите, если что, я еще только учусь Вот программа:
Код:
unit Unit16;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TIncodeMes = array of longint;
TForm16 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Button1: TButton;
Memo3: TMemo;
Button2: TButton;
GroupBox1: TGroupBox;
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Image1: TImage;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Button3: TButton;
Edit4: TEdit;
Edit5: TEdit;
Button4: TButton;
Memo4: TMemo;
Button5: TButton;
Button6: TButton;
Edit6: TEdit;
Memo5: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
FMes,AttFMes,NAttFMes: TIncodeMes;
public
{ Public declarations }
end;
var
Form16: TForm16;
implementation
uses math;
{$R *.dfm}
//Значение бита в двойном слове (32бита)
function Bit(Value, n: Integer): Boolean;
asm
bt eax, edx
setc al
and eax, 0FFh
end;
//Функция быcтрого возведения в степень
function FastPower(a, b, n: integer): integer;
var i: integer;
ai: extended;
begin
ai := a;
for I := Trunc(log2(b)) - 1 downto 0 do
if Bit(b, i) then ai := Round(sqr(ai) * a) mod n else ai := Round(sqr(ai)) mod n;
result := Round(ai);
end;
function Encrypt(s: string; e, n: integer): TIncodeMes;
var I: Integer;
begin
SetLength(result, length(s));
for I := 0 to Length(s) - 1 do
result[i] := FastPower(ord(s[i+1]), e, n)
end;
function Decrypt(s: array of integer; e, n: integer): string;
var i: Integer;
begin
SetLength(Result, Length(s));
for I := 0 to Length(s) - 1 do
result[i + 1] := chr(FastPower(s[i], e, n))
end;
function Nod(a,b:integer):integer;
var i:integer;
begin
while a<>b do if a>b then a:=a-b else b:=b-a;
result:=a;
end;
function ArrayToString(a: TIncodeMes): String;
var
i: Integer;
begin
Result := '';
for i := Low(a) to High(a) do
Result := Result + inttostr(a[i]);
end;
//Шифрование текста в Memo
procedure TForm16.Button1Click(Sender: TObject);
var i, n, e: Integer;
begin
n := StrToInt(Edit3.Text);
e := StrToInt(Edit2.Text);
FMes := Encrypt(Memo1.Lines.Text, e, n);
for i :=0 to high(Fmes) do Memo2.Lines.Append(inttostr(FMes[i]));
end;
//Дешифровка сообщения
procedure TForm16.Button2Click(Sender: TObject);
var i, n, d: integer;
s : string;
begin
d := StrToInt(Edit1.Text);
n := StrToInt(Edit3.Text);
s := Decrypt(FMes,d , n);
Memo3.Lines.Add(s);
end;
procedure TForm16.Button3Click(Sender: TObject);
var n,p,q,F,i,e,k,d:integer;
begin
p:=strtoint(edit4.Text);
q:=strtoint(edit5.Text);
n:=p*q;
F:=(p-1)*(q-1);
randomize;
for i:=2 to F do
if nod(i,F)=1 then
begin
e:=i;
break;
end;
k:=1;
while (k*F+1)mod e<>0 do
inc(k);
d:=(k*F+1)div e;
edit1.Text:=inttostr(d);
edit2.Text:=inttostr(e);
edit3.Text:=inttostr(n);
end;
procedure TForm16.Button4Click(Sender: TObject);
var i, j, n, e, ct, ct1, tempint1: Integer;
A: array of integer;
dwStart, dwEnd, dwDiff : DWORD;
begin
dwStart := GetTickCount();
ct1:=0;
n := StrToInt(Edit3.Text);
e := StrToInt(Edit2.Text);
SetLength(A, Memo2.Lines.Count);
for i:=0 to (Memo2.Lines.Count-1) do A[i] := FastPower(strtoint(Memo2.Lines[i]), e, n);
repeat
ct:=0;
for i:=0 to Memo2.Lines.Count-1 do
begin
A[i]:= FastPower(A[i], e, n);
if IntToStr(A[i])=Memo2.Lines[i] then inc(ct);
end;
inc(ct1);
until ct=Memo2.Lines.Count;
for i:=0 to (Memo2.Lines.Count-1) do A[i] := FastPower(strtoint(Memo2.Lines[i]), e, n);
for i := 0 to ct1-2 do
begin
for j:=0 to (Memo2.Lines.Count-1) do A[j] := FastPower(A[j], e, n);
end;
for i:=0 to (Memo2.Lines.Count-1)do Memo4.Lines.Text:=Memo4.Lines.Text+chr(A[i]);
for i:=1 to 100 do
Sleep(10);
dwEnd := GetTickCount(); // конец блока кода
dwDiff := dwEnd - dwStart; // вычисляем разницу
ShowMessage('Взлом занял '+IntToStr(dwDiff)+' мсек.');
end;
procedure TForm16.Button5Click(Sender: TObject);
begin
Memo3.Lines.Clear;
Memo2.Lines.Clear;
Memo1.Lines.Clear;
Memo4.Lines.Clear;
Memo5.Lines.Clear;
end;
end.
|