⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit2.pas

📁 Delphi实现的RSA算法源码
💻 PAS
字号:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm2 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    E_p: TEdit;
    Label2: TLabel;
    E_q: TEdit;
    Label3: TLabel;
    E_n: TEdit;
    L_n0: TLabel;
    E_n0: TEdit;
    Button1: TButton;
    Label5: TLabel;
    E_e: TEdit;
    Button2: TButton;
    Label6: TLabel;
    E_d: TEdit;
    B_zuf_PZ: TButton;
    Button3: TButton;
    L_nr1: TLabel;
    L_nr2: TLabel;
    CheckBox1: TCheckBox;
    L_probe: TLabel;
    procedure B_zuf_PZClick(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure E_pChange(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

uses jmhilf, jmmath, Unit1;

{$R *.DFM}

procedure TForm2.B_zuf_PZClick(Sender: TObject);
var
  nr1, nr2: integer;
  p1, p2: extended;
begin
  e_p.text := 'Bitte';
  e_q.text := 'warten';
  application.ProcessMessages;
  if checkbox1.Checked then
  begin
    nr1 := random(100);
    nr2 := random(100);
  end
  else
  begin
    nr1 := random(6000); //Die verschl黶seltem Zahlen d黵fen h鯿hstens 9-stellig werden.
    nr2 := random(6000); //Da beim quadrieren die Genauigkeit von 18 Stellen nicht 黚erschritten werden darf
  end;
  repeat
    p1 := primzahl_(nr1);
    p2 := primzahl_(nr2);
    nr1 := nr1 + 10;
    nr2 := nr2 + 10;
  until p1 * p2 > BB; //sonst keine eindeutige Abbildung m鰃lich
  e_p.text := ssd(primzahl_(nr1), 0); //Dauert bei 1 MHz_prozessor h鯿hstens ca. 12sec
  e_q.text := ssd(primzahl_(nr2), 0);
  L_nr1.caption := 'PZ Nr.:' + intToStr(nr1);
  L_nr2.caption := 'PZ Nr.:' + intToStr(nr2);

end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  close
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  p, q: extended;
begin
  p := rr(e_p.text);
  q := rr(e_q.text);
  e_n.text := ssd(p * q, 20);
  Form1.e_n.text := e_n.text;
  e_n0.text := ssd((p - 1) * (q - 1), 20);
  e_n0.Hide;
  l_n0.hide;
  e_e.text := ssd(int(sqrt(p * q)), 20);
  form1.E_e.text := e_e.text;
end;

function invers_mod(e, m: extended): Extended; //ggT(e,m)=1 =>Es gibt x,y; xe+ym=1
                                             // => xe = 1 mod m
var
  m0, x0, x1, y0, y1, xx, yy, q, r: extended;
  sign: integer;
begin //Der erweiterte Euklidische Algorithmus
  m0 := m;
  x0 := 1;
  x1 := 0;
  y0 := 0;
  y1 := 1;
  sign := 1;
  while e <> 0 do
  begin
    q := int(m / e); //q:=m div e
    r := m - e * q; //r:=m mod e
    m := e;
    e := r;
    xx := x1;
    yy := y1;
    x1 := q * x1 + x0;
    y1 := q * y1 + y0;
    x0 := xx;
    y0 := yy;
    sign := -sign;
  end;
  y0 := -sign * y0;
  if y0 < m then y0 := m0 + y0;
  result := y0;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
  ed, e, d, n0, q, r: extended;
begin
  e := rr(e_e.text);
  n0 := rr(e_n0.text);
  while (e > 1) and (ggTReal(n0, e) > 1) do
    e := int(e - 0.9); //dto dec(e) f黵 reelles e
  e_e.text := ssd(e, 0);
  form1.E_e.text := e_e.text;
  d := invers_mod(e, n0);
  e_d.text := ssd(d, 0);
  e_n0.Show;
  l_n0.Show;
  form1.E_d.text := e_d.text;
  //Probe
  ed := e * d;
  q := int(ed / n0);
  r := round(ed - q * n0); //=1
  L_probe.Caption := 'e*d=' + ssd(ed, 0) + '=' + ssd(q, 0) + '*' + ssd(n0, 0) + '+' + ssd(r, 0) + '=1 mod ' + ssd(n0, 0);
end;

procedure TForm2.E_pChange(Sender: TObject);
begin
  e_n.text := '';
  e_n0.text := '';
  e_e.text := '';
  e_d.text := '';
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -