您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页DES算法

DES算法

来源:意榕旅游网
v

DES算法Delphi源代码 (14K字) 作者:

zju78

打印本页

发表于:2010年12月22日 17:41

unit Unit1;

interface uses

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

TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; Label3: TLabel;

procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private

{ Private declarations } public

{ Public declarations } end; type

TKeyByte = array[0..5] of Byte;

TDesMode = (dmEncry, dmDecry);

function EncryStr(Str, Key: String): String; function DecryStr(Str, Key: String): String; function EncryStrHex(Str, Key: String): String; function DecryStrHex(StrHex, Key: String): String; const

BitIP: array[0..63] of Byte = //初始值置IP (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, 56, 48, 40, 32, 24, 16, 8, 0, 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, , 46, 38, 30, 22, 14, 6 );

BitCP: array[0..63] of Byte = //逆初始置IP-1 ( 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, , 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, 32, 0, 40, 8, 48, 16, 56, 24 );

BitExp: array[0..47] of Integer = // 位选择函数E ( 31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8, 9,10, 11,12,11,12,13,14,15,16,15,16,17,18,19,20,19,20, 21,22,23,24,23,24,25,26,27,28,27,28,29,30,31,0 );

BitPM: array[0..31] of Byte = //置换函数P

( 15, 6,19,20,28,11,27,16, 0,14,22,25, 4,17,30, 9, 1, 7,23,13,31,26, 2, 8,18,12,29, 5,21,10, 3,24 );

sBox: array[0..7] of array[0..63] 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 ) );

BitPMC1: array[0..55] of Byte = //选择置换PC-1 ( 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 62, , 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 );

BitPMC2: array[0..47] of Byte =//选择置换PC-2 ( 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, , 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 ); var

Form1: TForm1;

subKey: array[0..15] of TKeyByte;

implementation

{$R *.dfm}

procedure initPermutation(var inData: array of Byte); var

newData: array[0..7] of Byte; i: Integer; begin

FillChar(newData, 8, 0); for i := 0 to 63 do

if (inData[BitIP[i] shr 3] and (1 shl (7- (BitIP[i] and $07)))) <> 0 then newData[i shr 3] := newData[i shr 3] or (1 shl (7-(i and $07))); for i := 0 to 7 do inData[i] := newData[i]; end;

procedure conversePermutation(var inData: array of Byte); var

newData: array[0..7] of Byte; i: Integer; begin

FillChar(newData, 8, 0); for i := 0 to 63 do

if (inData[BitCP[i] shr 3] and (1 shl (7-(BitCP[i] and $07)))) <> 0 then newData[i shr 3] := newData[i shr 3] or (1 shl (7-(i and $07))); for i := 0 to 7 do inData[i] := newData[i]; end;

procedure expand(inData: array of Byte; var outData: array of Byte); var

i: Integer; begin

FillChar(outData, 6, 0); for i := 0 to 47 do

if (inData[BitExp[i] shr 3] and (1 shl (7-(BitExp[i] and $07)))) <> 0 then outData[i shr 3] := outData[i shr 3] or (1 shl (7-(i and $07))); end;

procedure permutation(var inData: array of Byte); var

newData: array[0..3] of Byte; i: Integer; begin

FillChar(newData, 4, 0); for i := 0 to 31 do

if (inData[BitPM[i] shr 3] and (1 shl (7-(BitPM[i] and $07)))) <> 0 then newData[i shr 3] := newData[i shr 3] or (1 shl (7-(i and $07))); for i := 0 to 3 do inData[i] := newData[i]; end;

function si(s,inByte: Byte): Byte; var c: Byte; begin

c := (inByte and $20) or ((inByte and $1e) shr 1) or ((inByte and $01) shl 4); Result := (sBox[s][c] and $0f); end;

procedure permutationChoose1(inData: array of Byte; var outData: array of Byte); var i: Integer;

begin

FillChar(outData, 7, 0); for i := 0 to 55 do

if (inData[BitPMC1[i] shr 3] and (1 shl (7-(BitPMC1[i] and $07)))) <> 0 then outData[i shr 3] := outData[i shr 3] or (1 shl (7-(i and $07))); end;

procedure permutationChoose2(inData: array of Byte; var outData: array of Byte); var i: Integer; begin

FillChar(outData, 6, 0); for i := 0 to 47 do

if (inData[BitPMC2[i] shr 3] and (1 shl (7-(BitPMC2[i] and $07)))) <> 0 then outData[i shr 3] := outData[i shr 3] or (1 shl (7-(i and $07))); end;

procedure cycleMove(var inData: array of Byte; bitMove: Byte); var i: Integer; begin

for i := 0 to bitMove - 1 do begin

inData[0] := (inData[0] shl 1) or (inData[1] shr 7); inData[1] := (inData[1] shl 1) or (inData[2] shr 7); inData[2] := (inData[2] shl 1) or (inData[3] shr 7);

inData[3] := (inData[3] shl 1) or ((inData[0] and $10) shr 4); inData[0] := (inData[0] and $0f); end; end;

procedure makeKey(inKey: array of Byte; var outKey: array of TKeyByte);

const

bitDisplace: array[0..15] of Byte = ( 1,1,2,2, 2,2,2,2, 1,2,2,2, 2,2,2,1 ); var

outData56: array[0..6] of Byte; key28l: array[0..3] of Byte; key28r: array[0..3] of Byte; key56o: array[0..6] of Byte; i: Integer; begin

permutationChoose1(inKey, outData56);

key28l[0] := outData56[0] shr 4;

key28l[1] := (outData56[0] shl 4) or (outData56[1] shr 4); key28l[2] := (outData56[1] shl 4) or (outData56[2] shr 4); key28l[3] := (outData56[2] shl 4) or (outData56[3] shr 4); key28r[0] := outData56[3] and $0f; key28r[1] := outData56[4]; key28r[2] := outData56[5]; key28r[3] := outData56[6];

for i := 0 to 15 do begin

cycleMove(key28l, bitDisplace[i]); cycleMove(key28r, bitDisplace[i]);

key56o[0] := (key28l[0] shl 4) or (key28l[1] shr 4); key56o[1] := (key28l[1] shl 4) or (key28l[2] shr 4); key56o[2] := (key28l[2] shl 4) or (key28l[3] shr 4); key56o[3] := (key28l[3] shl 4) or (key28r[0]); key56o[4] := key28r[1]; key56o[5] := key28r[2]; key56o[6] := key28r[3];

permutationChoose2(key56o, outKey[i]);

end; end;

procedure encry(inData, subKey: array of Byte; var outData: array of Byte); var

outBuf: array[0..5] of Byte; buf: array[0..7] of Byte; i: Integer; begin

expand(inData, outBuf);

for i := 0 to 5 do outBuf[i] := outBuf[i] xor subKey[i]; buf[0] := outBuf[0] shr 2;

buf[1] := ((outBuf[0] and $03) shl 4) or (outBuf[1] shr 4); buf[2] := ((outBuf[1] and $0f) shl 2) or (outBuf[2] shr 6); buf[3] := outBuf[2] and $3f; buf[4] := outBuf[3] shr 2;

buf[5] := ((outBuf[3] and $03) shl 4) or (outBuf[4] shr 4); buf[6] := ((outBuf[4] and $0f) shl 2) or (outBuf[5] shr 6); buf[7] := outBuf[5] and $3f;

for i := 0 to 7 do buf[i] := si(i, buf[i]);

for i := 0 to 3 do outBuf[i] := (buf[i*2] shl 4) or buf[i*2+1]; permutation(outBuf);

for i := 0 to 3 do outData[i] := outBuf[i]; end;

procedure desData(desMode: TDesMode;

inData: array of Byte; var outData: array of Byte); // inData, outData 都为8Bytes,否则出错 var

i, j: Integer;

temp, buf: array[0..3] of Byte; begin

for i := 0 to 7 do outData[i] := inData[i]; initPermutation(outData); if desMode = dmEncry then begin

for i := 0 to 15 do begin

for j := 0 to 3 do temp[j] := outData[j]; //temp = Ln for j := 0 to 3 do outData[j] := outData[j + 4]; //Ln+1 = Rn encry(outData, subKey[i], buf); //Rn ==Kn==> buf

for j := 0 to 3 do outData[j + 4] := temp[j] xor buf[j]; //Rn+1 = Ln^buf end;

for j := 0 to 3 do temp[j] := outData[j + 4]; for j := 0 to 3 do outData[j + 4] := outData[j]; for j := 0 to 3 do outData[j] := temp[j]; end

else if desMode = dmDecry then begin

for i := 15 downto 0 do begin

for j := 0 to 3 do temp[j] := outData[j]; for j := 0 to 3 do outData[j] := outData[j + 4]; encry(outData, subKey[i], buf);

for j := 0 to 3 do outData[j + 4] := temp[j] xor buf[j]; end;

for j := 0 to 3 do temp[j] := outData[j + 4]; for j := 0 to 3 do outData[j + 4] := outData[j]; for j := 0 to 3 do outData[j] := temp[j]; end;

conversePermutation(outData); end;

//////////////////////////////////////////////////////////////

function EncryStr(Str, Key: String): String; var

StrByte, OutByte, KeyByte: array[0..7] of Byte; StrResult: String; I, J: Integer; begin

if (Length(Str) > 0) and (Ord(Str[Length(Str)]) = 0) then raise Exception.Create(\"Error: the last char is NULL char.\"); if Length(Key) < 8 then

while Length(Key) < 8 do Key := Key + Chr(0); while Length(Str) mod 8 <> 0 do Str := Str + Chr(0);

for J := 0 to 7 do KeyByte[J] := Ord(Key[J + 1]); makeKey(keyByte, subKey);

StrResult := \"\";

for I := 0 to Length(Str) div 8 - 1 do begin

for J := 0 to 7 do

StrByte[J] := Ord(Str[I * 8 + J + 1]); desData(dmEncry, StrByte, OutByte); for J := 0 to 7 do

StrResult := StrResult + Chr(OutByte[J]); end;

Result := StrResult; end;

function DecryStr(Str, Key: String): String; var

StrByte, OutByte, KeyByte: array[0..7] of Byte;

StrResult: String; I, J: Integer; begin

if Length(Key) < 8 then

while Length(Key) < 8 do Key := Key + Chr(0);

for J := 0 to 7 do KeyByte[J] := Ord(Key[J + 1]); makeKey(keyByte, subKey);

StrResult := \"\";

for I := 0 to Length(Str) div 8 - 1 do begin

for J := 0 to 7 do StrByte[J] := Ord(Str[I * 8 + J + 1]); desData(dmDecry, StrByte, OutByte); for J := 0 to 7 do

StrResult := StrResult + Chr(OutByte[J]); end;

while (Length(StrResult) > 0) and

(Ord(StrResult[Length(StrResult)]) = 0) do Delete(StrResult, Length(StrResult), 1); Result := StrResult; end;

///////////////////////////////////////////////////////////

function EncryStrHex(Str, Key: String): String; var

StrResult, TempResult, Temp: String; I: Integer; begin

TempResult := EncryStr(Str, Key); StrResult := \"\";

for I := 0 to Length(TempResult) - 1 do begin

Temp := Format(\"%x\if Length(Temp) = 1 then Temp := \"0\" + Temp; StrResult := StrResult + Temp; end;

Result := StrResult; end;

function DecryStrHex(StrHex, Key: String): String; function HexToInt(Hex: String): Integer; var

I, Res: Integer; ch: Char; begin Res := 0;

for I := 0 to Length(Hex) - 1 do begin

ch := Hex[I + 1];

if (ch >= \"0\") and (ch <= \"9\") then Res := Res * 16 + Ord(ch) - Ord(\"0\") else if (ch >= \"A\") and (ch <= \"F\") then Res := Res * 16 + Ord(ch) - Ord(\"A\") + 10 else if (ch >= \"a\") and (ch <= \"f\") then Res := Res * 16 + Ord(ch) - Ord(\"a\") + 10

else raise Exception.Create(\"Error: not a Hex String\"); end;

Result := Res; end; var

Str, Temp: String; I: Integer;

begin Str := \"\";

for I := 0 to Length(StrHex) div 2 - 1 do begin

Temp := Copy(StrHex, I * 2 + 1, 2); Str := Str + Chr(HexToInt(Temp)); end;

Result := DecryStr(Str, Key); end;

procedure TForm1.Button1Click(Sender: TObject); begin

//function EncryStrHex(Str, Key: String): String; //这里的Str表示你要进行加密的字符串,Key表示密钥; //function DecryStrHex(StrHex, Key: String): String; //这里的Str表示你要进行解密的字符串,Key表示密钥;

if EncryStrhex(Edit1.Text,\"ksaiy\")=Edit2.Text then //这里的ksaiy是密钥,你可以设置自己的密钥。 ShowMessage(\"注册成功!\") else

ShowMessage(\"注册失败!\");

/////////////////////////////////////////////////////////////////////////////// -

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务