背包公钥系统

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. 

  

原文地址:https://www.cnblogs.com/toosuo/p/3372524.html