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

📄 public_key.pas

📁 一个基于背包公钥系统的能实现加密功能的小程序。
💻 PAS
字号:
unit public_key;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Edit3: TEdit;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
var
  M:array of integer;
  A:array of integer;
  B:array of integer;
  c,w_1,k:integer;        //k>b1+b2+...+bn;
                          //w_1是w的逆;

implementation


{$R *.dfm}

Function judge_pri_num(p:integer):integer;          //判断是否是素数;
var
    l,i:integer;
begin
    i:=2;
    l:=0;
    while(i<=Sqrt(strtofloat(inttostr(p)))) and (l=0) do
      if p mod i=0 then l:=1 else i:=i+1;
    judge_pri_num:=l;
end;

Function judge_twonum_prime(m,n:integer):integer;   //判断两个数是否互素;
var
    i,temp,p:integer;
begin
    p:=0;
    if m>n then            //确定m<n,若m>n,则调换
      begin
        temp:=m;
        m:=n;
        n:=temp;
      end;
    for i:=2 to m do
      if (m mod i=0) and (n mod i=0) then
        p:=1;              //说明m,n不互素;
    judge_twonum_prime:=p;
end;

procedure produce_a(j:integer);     //产生序列A[i];
var
    i,m,n,w,w_1:integer;
begin
    setlength(B,j-1);
    setlength(A,j-1);
    B[0]:=random(10);
    for i:=1 to (j-1) do                //产生随机的超递增序列B[i];
      B[i+1]:=2*B[i]+random(100);
    k:=2*B[j-1]+random(10);
    repeat
    w:=random(1000);
    until judge_twonum_prime(k,w)=0;
    m:=1;
    repeat
      n:=w*m;
      m:=m+1;
    until n mod k=1;
    w_1:=n;
    for i:=0 to (j-1) do
      A[i]:=(B[i]*w) mod k;                  //将A[i]作为公钥;
end;


procedure TForm1.Button1Click(Sender: TObject);   //加密过程;
var
    s1:string;
    i,j:integer;
begin
    s1:=edit1.Text;
    i:=length(s1);                    //No error;
    //edit4.Text:=Copy(s1,0,1);
    c:=0;
    setlength(M,i-1);
    for j:=0 to i-1 do
      M[j]:=strtoint(Copy(s1,j,1));
    //edit4.Text:=inttostr(M[1]);
    produce_a(i);
    for j:=0 to (i-1) do
      c:=c+A[j]*M[j];
    edit2.Text:=inttostr(c);
end;

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

procedure TForm1.Button2Click(Sender: TObject);   //解密过程;
var
    i,j,m:integer;
    s:string;
begin
    s:='';
    i:=(c*w_1) mod k;
    j:=length(edit1.Text);
    setlength(M,j-1);
    for m:=0 to (j-1) do
      M[m]:=0;
    for m:=(j-1) to 0 do
      begin
        if B[m]<i then
          begin
            M[m]:=1;
            i:=i-B[m];
          end
      end;
    for m:=0 to (j-1) do
      s:=s+'inttostr(M[m])';
    edit3.Text:=s;
end;

end.

⌨️ 快捷键说明

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