Добрый вечер. Для курсовой работы нужно написать программу на делфи, шифрующую текст с помощью алгоритма RSA. Принцип работы моего варианта следующий. Случайным образом генерируются простые числа p и q, расчитываются открытый и закрытый ключи. Затем каждый символ исходного сообщения преобразовывается в соответствующий ему ASCII код, который шифруется открытым ключом и полученный код преобразуется в символ. Есть 2 проблемы:
1) Программа неправильно шифрует текст. Например, слово "Привет" с открытым ключом (21013,55493) она шифрует, как "Џч" (без кавычек).
2) При попытке расшифровки выскакивает ошибка:
Вложение 661120
и выделяется строка "s:=s*ord(Memo3.Text[i]);".
Где тут могут быть проблемы?
1) Программа неправильно шифрует текст. Например, слово "Привет" с открытым ключом (21013,55493) она шифрует, как "Џч" (без кавычек).
2) При попытке расшифровки выскакивает ошибка:
Вложение 661120
и выделяется строка "s:=s*ord(Memo3.Text[i]);".
Где тут могут быть проблемы?
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Math;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Label3: TLabel;
Edit2: TEdit;
Label4: TLabel;
Edit3: TEdit;
Label5: TLabel;
Edit4: TEdit;
Label6: TLabel;
Edit5: TEdit;
Label7: TLabel;
Edit6: TEdit;
Button1: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Memo2: TMemo;
Button5: TButton;
Label8: TLabel;
Memo3: TMemo;
Label9: TLabel;
Memo4: TMemo;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var p,q,s,n,eil,e,i,d:integer;
alf,slovo,anslovo:string;
label m1,m2,m3;
begin
Memo1.Lines.Clear;
p:=0; q:=0;
while p=q do
//Генератор простых чисел p и q
begin
m1: randomize;
p:=RandomRange(100,900);
for i:=2 to p-1 do
begin
s:=p mod i;
if s=0 then goto m1;
end;
Edit1.Text:=FloatToStr(p);
m2: randomize;
q:=RandomRange(100,900);
for i:=2 to q-1 do
begin
s:=q mod i;
if s=0 then goto m2;
end;
Edit2.Text:=FloatToStr(q);
end;
//Расчёт значений n и ф(n)
n:=p*q;
eil:=(p-1)*(q-1);
Edit3.Text:=FloatToStr(n);
Edit4.Text:=FloatToStr(eil);
//Поиск открытой экспоненты e
m3: randomize;
e:=RandomRange(2,eil);
for i:=2 to e do
if (e mod i = 0) and (eil mod i = 0) then goto m3;
Edit5.Text:=FloatToStr(e);
//Расчёт секретной экспоненты d
for i:=1 to n do
if e*i mod eil = 1 then
break;
d:=i;
Edit6.Text:=FloatToStr(d);
Memo1.Lines.Add('Открытый ключ: ('+Edit5.Text+','+Edit3.Text+')');
Memo1.Lines.Add('Закрытый ключ: ('+Edit6.Text+','+Edit3.Text+')');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Memo2.Lines.LoadFromFile(OpenDialog1.FileName);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Memo4.Lines.LoadFromFile(SaveDialog1.FileName);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Memo4.Lines.SaveToFile(OpenDialog1.FileName);
end;
//Шифрование
procedure TForm1.Button5Click(Sender: TObject);
var k,s,e,n:int64;
i:cardinal;
begin
e:=StrToInt(Edit5.Text);
n:=StrToInt(Edit3.Text);
for i:=1 to length(Memo2.Text) do
begin
k:=1; s:=1;
while k<=e do
begin
s:=s*ord(Memo2.Text[i]);
k:=k+1;
end;
Memo3.Text:=Memo3.Text+chr(s mod n);
end;
end;
//Расшифровка текста
procedure TForm1.Button6Click(Sender: TObject);
var k,s,d,n:int64;
i:cardinal;
begin
d:=StrToInt(Edit6.Text);
n:=StrToInt(Edit3.Text);
for i:=1 to length(Memo2.Text) do
begin
k:=1; s:=1;
while k<=d do
begin
s:=s*ord(Memo3.Text[i]);
k:=k+1;
end;
Memo3.Text:=Memo4.Text+chr(s mod n);
end;
end;
end.