Quantcast
Channel: Форум программистов и сисадминов Киберфорум
Viewing all articles
Browse latest Browse all 517205

Шифрование текста по алгоритму RSA - Delphi для начинающих

$
0
0
Добрый вечер. Для курсовой работы нужно написать программу на делфи, шифрующую текст с помощью алгоритма RSA. Принцип работы моего варианта следующий. Случайным образом генерируются простые числа p и q, расчитываются открытый и закрытый ключи. Затем каждый символ исходного сообщения преобразовывается в соответствующий ему ASCII код, который шифруется открытым ключом и полученный код преобразуется в символ. Есть 2 проблемы:
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.


Изображения
Тип файла: jpg Снимок.JPG (25.4 Кб)

Viewing all articles
Browse latest Browse all 517205

Trending Articles