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

📄 mianunit.~pas

📁 本例采用Delphi实现经典的DES加密解密算法,界面友好,功能齐全,代码书写规范,可供参考!
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
unit MianUnit;
{************************************}
{*       DES加密的Delphi实现        *}
{*          作者:程  亮            *}
{*           信电工程系             *}
{*        04级网络〈2〉班           *}
{*    E-mail:999419@sohu.com       *}
{************************************}
interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Memo1: TMemo;
    GroupBox3: TGroupBox;
    Memo2: TMemo;
    GroupBox4: TGroupBox;
    Memo3: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    GroupBox5: TGroupBox;
    Edit1: TEdit;
    Button4: TButton;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);

  private
    { Private declarations }
    function LMove(k:string;s:integer):string;//密钥左移
    function ZMYChange(x:string;y:string):string;//得到48位子密钥函数
    function KZR(r:string):string;//把R扩展为48 位函数
    function LiRi(r:string):string;//求Li、Ri
    function OcttoBin(i: integer): string;//十进制数转换成二进制数
    function CnBinToInt(k: string): integer;//二进制数转换成十进制数
    function XORXY(x:string;y:string):string;//两个数异或函数
    function rPZH(r:string):string;//P置换函数
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
const
  ZH:array[1..64] of integer=                       //初始置换
  (58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,
   62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,
   57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,
   61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7);

   NZH:array[1..64] of integer=                     //逆置换
  (40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,
   38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,
   36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,
   34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25);

   MYZH:array[1..56] of integer=                    //密钥置换
   (57,49,41,33,25,17,9,1,58,50,42,34,26,18,
    10,2,59,51,43,35,27,19,11,3,60,52,44,36,
    63,55,47,39,31,23,15,7,62,54,46,38,30,22,
    14,6,61,53,45,37,29,41,13,5,28,20,12,4);

   KZZH:array[1..48] of integer=                    //扩展
   (32,1,2,3,4,5,4,5,6,7,8,9,
    8,9,10,11,12,13,12,13,14,15,16,17,
    16,17,18,19,20,21,20,21,22,23,24,25,
    24,25,26,27,28,29,28,29,30,31,32,1);

   ZMY:array[1..48] of integer=                          //子密钥置换
   (14, 17, 11, 24,  1,  5, 3, 28, 15,  6, 21, 10,
    23, 19, 12,  4, 26,  8,16,  7, 27, 20, 13,  2,
    41, 52, 31, 37, 47, 55,30, 40, 51, 45, 33, 48,
    44, 49, 39, 56, 34, 53,46, 42, 50, 36, 29, 32 );

   sBox: array[1..8] of array[1..64] of Byte =    //S盒
    ( ( 14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
         0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
         4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
        15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13 ),

      ( 15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
         3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
         0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
        13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9 ),

      ( 10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
        13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
        13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
         1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12 ),

      (  7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
        13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
        10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
         3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14 ),

      (  2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
        14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
         4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
        11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3 ),

      ( 12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
        10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
         9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
         4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13 ),

      (  4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
        13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
         1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
         6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12 ),

      ( 13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
         1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
         7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
         2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11 ) );
   PZH:array[1..32] of integer=                              //P置换
     (16,7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,
       2,8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25);
implementation

uses example, aboutDES;



{$R *.dfm}
function BinToHexEachOther(ValueA : string; Action : Boolean) : string;//把二进制串转换成十六进制串或相反
 var
  ValueArray1 : Array [0..15] of string[4];
  ValueArray2 : Array [0..15] of char; 
  i : shortint; 
begin 
  //数组初始化 
  ValueArray1[0] := '0000'; ValueArray1[1] := '0001'; ValueArray1[2] := '0010';
  ValueArray1[3] := '0011'; ValueArray1[4] := '0100'; ValueArray1[5] := '0101'; 
  ValueArray1[6] := '0110'; ValueArray1[7] := '0111'; ValueArray1[8] := '1000'; 
  ValueArray1[9] := '1001'; ValueArray1[10] := '1010'; ValueArray1[11] := '1011'; 
  ValueArray1[12] := '1100'; ValueArray1[13] := '1101'; ValueArray1[14] := '1110'; 
  ValueArray1[15] := '1111';
  for i := 0 to 15 do 
   if i >= 10 then ValueArray2[i] := chr(65 + (i - 10)) 
   else ValueArray2[i] := inttostr(i)[1];

  Result := '';
  if Action then 
  begin              //二进制串转换成十六进制串
   if (Length(ValueA) MOD 4 <> 0) then 
    ValueA := stringofchar('0',Length(ValueA) MOD 4) + ValueA; 
   while (Length(ValueA) >= 4) do
   begin 
    for i := 0 to 15 do 
     if Copy(ValueA,1,4) = ValueArray1[i] then 
      Result := Result + ValueArray2[i]; 
    ValueA := Copy(ValueA,5,Length(ValueA) - 4);
   end; 
  end 
  else begin              //十六进制串转换成二进制串
   while (Length(ValueA) >= 1) do 
   begin
    for i := 0 to 15 do 
     if Copy(ValueA,1,1) = ValueArray2[i] then 
      Result := Result + ValueArray1[i];
    ValueA := Copy(ValueA,2,Length(ValueA) - 1);
   end;
  end;
end;

function HexCharToInt(HexToken : char):Integer;
begin
Result:=0;
if (HexToken>#47) and (HexToken<#58) then    { chars 0....9 }
  Result:=Ord(HexToken)-48
else if (HexToken>#64) and (HexToken<#71) then { chars A....F }
  Result:=Ord(HexToken)-65 + 10;
end;


Function ConvertStrToBin(Value : string):string;//把字符串转化为二进制数 
var tempHex : string[2]; 
  i : integer; 
begin
 Result := ''; 
 if trim(Value) = '' then Exit;
 tempHex := ''; 
 for i := 1 to Length(Value) do 
 begin
  tempHex := IntToHex(Ord(Value[i]),2);//每个字符转成两位十六进制数 
  Result := Result + BinToHexEachOther(tempHex,False);//十六进制转成二进制
 end; 
end;

Function ConvertBinToStr(Value : string):string; //把二进制数据转化为字符串
Var tempHex : string; 
  i, tempInt : integer;
begin
 Result := ''; 
 if trim(Value) = '' then Exit;
 tempHex := BinToHexEachOther(Value,true);//二进制转成十六进制 
 i := 0;
 Repeat
  begin
   i := i + 1;
   tempInt := HexCharToInt(tempHex[i]);
   i := i + 1;
   tempInt := tempInt * 16 + HexCharToInt(tempHex[i]);
    //以上将两位十六进制数转变为一个十进制数
   Result := Result + chr(TempInt); //转成ASCII码
  end;
 Until i >= length(tempHex)
end;

function TForm1.LMove(k:string;s:integer):string;//密钥左移函数
var
 i:integer;
 t,t1:string;
begin
  t:='';t1:='';
  if s=1 then                  //左移一位
    begin
      for i:=2 to 28 do
        begin
          t1:=k[i];
          t:=t+t1;
        end;
      t:=t+k[1];
  end;
  if s=2 then                  //左移两位
    begin
      for i:=3 to 28 do
        begin
          t1:=k[i];
          t:=t+t1;
        end;
        t:=t+k[1]+k[2];
    end;
  result:=t;
end;
function TForm1.ZMYChange(x:string;y:string):string;//得到48位子密钥函数
var
  t,a:string;
  i:integer;
begin
  a:='';i:=1;
  t:=x+y;
  while i<=48 do
    begin
      a:=a+t[ZMY[i]];
      i:=i+1;
    end;
  result:=a;
end;
function TForm1.KZR(r:string):string;//把R扩展为48位
var
  i:integer;
  t:string;
begin
  i:=1;
  while i<=48 do
    begin
      t:=t+r[KZZH[i]];
      i:=i+1;
    end;
  result:=t;
end;

function TForm1.LiRi(r:string):string; //函数f(Ri-1,Ki)
var
  f,c,d:string;
  a:array[1..8] of string;
  i,x,y,t:integer;
begin
  f:='';
  a[1]:=copy(r,1,6);
  for i:=1 to 7 do
    a[i+1]:=copy(r,i*6+1,6);
  i:=1;
  while i<=8 do
    begin
      c:=copy(a[i],1,1)+copy(a[i],6,1);
      d:=copy(a[i],2,4);
      x:=form1.CnBinToInt(c);
      y:=form1.CnBinToInt(d);
      t:=sBox[i][x*16+y+1];
      f:=f+form1.OcttoBin(t);
      i:=i+1;
    end;

⌨️ 快捷键说明

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