📄 mianunit.~pas
字号:
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 + -