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

📄 新建 文本文档 (3).txt

📁 一个DES加密的实现
💻 TXT
📖 第 1 页 / 共 3 页
字号:
	LEA EBX, tblP;
	LEA ESI, BITS;
	ADD ESI, 32;
	MOV EDI, ESI;
	ADD ESI, CURRENT;
	ADD EDI, NEXT;
	XOR EAX,EAX;
	XOR ECX,ECX;
@P1:
	MOV AL, [EBX][ECX];
	DEC AL
	MOV DL, [ESI][EAX];
	MOV [EDI][ECX],DL;
	INC ECX;
	CMP ECX, 32
	JL @P1;

//R(i) = Li-1 ^ Ri-1
	XOR ECX, ECX
	SUB ESI, 32;
@L1:
	MOV EAX, [ESI][ECX];
	XOR [EDI][ECX], EAX;
	ADD ECX, 4;
	CMP ECX, 32;
	JL @L1;
// end;
	POP ECX;
//LOOP @LOOPKEY1;
	DEC ECX;
	JNZ @LOOPKEY1;

// Left = R16
	LEA ESI, BITS;
	MOV EDI, ESI;
	ADD ESI, NEXT;
	ADD EDI, CURRENT;
	ADD ESI, 32
	MOV ECX, 8;
	REP MOVSD;
// R=L16
	LEA ESI, BITS;
	MOV EDI, ESI;
	ADD ESI, NEXT;
	ADD EDI, CURRENT;
	ADD EDI, 32
	MOV ECX, 8;
	REP MOVSD;

	XOR NEXT, 64;

// UnIP
	LEA ESI, BITS;
	ADD ESI, NEXT;
	LEA EBX, tblUnIP;
	MOV EDI, DataAddr;
	XOR EAX, EAX;
	XOR ECX, ECX;
@UNIP1:
	MOV AL, [EBX][ECX];
	DEC AL;
	MOV DL, [ESI][EAX];
	MOV [EDI][ECX], DL;
	INC ECX;
	CMP ECX, 64;
	JL @UNIP1;

	POPAD;
	end;

procedure UNDES (var Data; const Keys; cLoop: Integer);
var
Bits: packed array [0..1,0..1,0..31] of Byte; //0..127
Bit48s: packed array [0..47] of Byte; //128..175
KeysAddr: Cardinal; //176..179
LoopCount: Cardinal; //180..183
DataAddr: Cardinal; //184..187
Current: Cardinal; //188..191
Next: Cardinal; //192..195



asm

	PUSHAD;
	MOV DWORD PTR LoopCount, ECX; //LoopCount
	IMUL ECX, 48;
	ADD EDX, ECX;
	MOV DWORD PTR KeysAddr, EDX; //KeysAddr
	MOV DWORD PTR DataAddr, EAX; //DataAddr
// IP
	XOR EDI, EDI;
	LEA EBX, tblIP;
	LEA ESI, BITS
	XOR ECX, ECX;
@IP1:
	MOV CL, [EBX][EDI];
	DEC CL;
	MOV DL, [EAX][ECX];
	MOV [ESI][EDI],DL;
	INC EDI;
	CMP EDI, 64;
	JL @IP1;

//R16= Left
	LEA ESI, BITS;
	MOV EDI, ESI;
	ADD EDI, 64;
	ADD ESI, 32
	MOV ECX, 8;
	REP MOVSD;
//L16=Right
	LEA ESI, BITS;
	MOV EDI, ESI;
	ADD EDI, 64;
	ADD EDI, 32
	MOV ECX, 8;
	REP MOVSD;

	MOV DWORD PTR Current, 0; 		//Current
	MOV DWORD PTR Next, 64; 		//Next

//for i := 16 downto 1 do
//begin

	MOV ECX, LoopCount;//Loop;
@Loop1:
	PUSH ECX;
	XOR DWORD PTR Current, 64;//Current
	XOR DWORD PTR Next, 64; //Next

//R(i-1) = L(i)
	MOV ECX, 8;
	LEA ESI, BITS;
	MOV EDI, ESI;
	ADD ESI, Current;//Current
	ADD EDI, Next;//Next
	ADD EDI, 32;
	REP MOVSD;

//48b(Li)
	LEA ESI, Bit48s;
	LEA EBX, tblE;
	LEA EAX, Bits;
	ADD EAX, Current;
	XOR EDI, EDI;
	XOR ECX, ECX;
@EXT1:
	MOV CL, [EBX][EDI];
	DEC CL;
	MOV DL, [EAX][ECX];
	MOV [ESI][EDI],DL;
	INC EDI;
	CMP EDI, 48;
	JL @EXT1;

//Li ^ Key i-1
	XOR EDI, EDI;
	MOV EBX, KeysAddr;
	SUB EBX, 48;
@USEK1:
	MOV EAX, [EBX][EDI];
	XOR [ESI][EDI], EAX;
	ADD EDI, 4;
	CMP EDI, 48;
	JL @USEK1;
	MOV KeysAddr, EBX;

//S(Li)
	LEA EDI, BITS;
	ADD EDI, Current;
	LEA EBX, tblS;
	MOV ECX,4
@S1:
	XOR EDX, EDX;
	XOR EAX, EAX;
	MOV DL, [ESI];
	SHL DL, 1;
	OR DL, [ESI][5];
	SHL EDX, CL;
	MOV AL,[ESI][1];
	SHL AL, 1;
	OR AL, [ESI][2];
	SHL AL, 1;
	OR AL, [ESI][3];
	SHL AL, 1;
	OR AL, [ESI][4];
	ADD EDX, EAX;
	XOR EAX,EAX;
	MOV AL, [EBX][EDX]
	ROR EAX, CL;
	ROL EAX, 1;
	MOV [EDI], AL;
	ROL EAX, 1;
	AND AL, 1;
	MOV [EDI][1], AL;
	ROL EAX, 1;
	AND EAX, 1;
	MOV [EDI][2], AL;
	ROL EAX, 1;
	AND AL,1;
	MOV [EDI][3], AL;
	ADD ESI, 6;
	ADD EDI, 4;
	INC CH;
	CMP CH, 8;
	JL @S1;

//P(Li)
	LEA EBX, tblP;
	LEA ESI, BITS;
	MOV EDI, ESI;
	ADD ESI, CURRENT;
	ADD EDI, NEXT;
	XOR EAX,EAX;
	XOR ECX,ECX;
@P1:
	MOV AL, [EBX][ECX];
	DEC AL;
	MOV DL, [ESI][EAX];
	MOV [EDI][ECX],DL;
	INC ECX;
	CMP ECX, 32
	JL @P1;

//L(i-1) = R(i) ^ Li
	XOR ECX, ECX
	ADD ESI, 32;
@L1:
	MOV EAX, [ESI][ECX];
	XOR [EDI][ECX], EAX;
	ADD ECX, 4;
	CMP ECX, 32;
	JL @L1;
//end;
	POP ECX;
	DEC ECX;
	JNZ @LOOP1;


//UnIP
	LEA ESI, BITS;
	ADD ESI, NEXT;
	LEA EBX, tblUnIP;
	MOV EDI, DataAddr;
	XOR EAX, EAX;
	XOR ECX, ECX;
@UNIP1:
	MOV AL, [EBX][ECX];
	DEC AL;
	MOV DL, [ESI][EAX];
	MOV [EDI][ECX], DL;
	INC ECX;
	CMP ECX, 64;
	JL @UNIP1;

	POPAD;
	end;

procedure GetBits(const Source; var Dest; cByte: Integer);


asm

	PUSH EBX;
	PUSH EDI;
	PUSH ESI;

	XOR EDI, EDI;
	XOR ESI, ESI;
	XOR EBX,EBX
@LOOP1:
	MOV BL, [EAX][ESI];
	ROR EBX,7;
	AND BL,1;
	MOV [EDX][EDI], BL;
	ROL EBX,1;
	AND BL,1;
	MOV [EDX][EDI+1], BL;
	ROL EBX,1;
	AND BL,1;
	MOV [EDX][EDI+2], BL;
	ROL EBX,1;
	AND BL,1;
	MOV [EDX][EDI+3], BL;
	ROL EBX,1;
	AND BL,1;
	MOV [EDX][EDI+4], BL;
	ROL EBX,1;
	AND BL,1;
	MOV [EDX][EDI+5], BL;
	ROL EBX,1;
	AND BL,1;
	MOV [EDX][EDI+6], BL;
	ROL EBX,1;
	AND BL,1;
	MOV [EDX][EDI+7], BL;
	ADD EDI, 8;
	INC ESI;
	LOOP @LOOP1

	POP ESI;
	POP EDI;
	POP EBX;
	end;

procedure SetBits(const Source; var Dest; cByte: Integer);


asm


	PUSH EBX;
	PUSH EDI;
	PUSH ESI;

	XOR EDI, EDI;
	XOR ESI, ESI;
@LOOP1:
	MOV BL, [EAX][ESI];
	SHL BL, 1;
	OR BL, [EAX][ESI + 1];
	SHL BL, 1;
	OR BL, [EAX][ESI + 2];
	SHL BL, 1;
	OR BL, [EAX][ESI + 3];
	SHL BL, 1;
	OR BL, [EAX][ESI + 4];
	SHL BL, 1;
	OR BL, [EAX][ESI + 5];
	SHL BL, 1;
	OR BL, [EAX][ESI + 6];
	SHL BL, 1;
	OR BL, [EAX][ESI + 7];
	MOV [EDX][EDI], BL
	ADD ESI, 8;
	INC EDI;
	LOOP @LOOP1

	POP ESI;
	POP EDI;
	POP EBX;
	end;


procedure MakeDesKeyData(const Key; var KeyData); assembler;
const
Idx56In64: packed array [0..55] of Byte =
(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,
21,13, 5,28,20,12, 4 );
Idx48In56: packed array[0..47] of Byte =
(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);
KeyShift: packed array [0..15] of Integer =
(1,1,2,2,
2,2,2,2,
1,2,2,2,
2,2,2,1);
var
Key64: packed array [0..63] of Byte;
Key56: packed array [0..55] of Byte;
KeyTemp: packed array [0..55] of Byte;
KeyDataAdr: Cardinal;

asm

// Get64Bits

	PUSH ESI;
	PUSH EDI;
	PUSH EBX;
	MOV KeyDataAdr, EDX;
	LEA EDX, Key64;
	MOV ECX, 8;
	CALL GetBits;
//64 Bits ==> 56 Bits
	LEA EDI, Key56;
	LEA ESI, Key64;
	LEA EBX, Idx56In64;
	XOR EAX, EAX;
	XOR ECX, ECX;
@1:
	MOV AL, [EBX][ESI];
	DEC AL;
	MOV CL, [ESI][EAX];
	MOV [EDI][ESI], CL;
	INC CH;
	CMP CH, 56;
	JL @1;

	XOR EDX,EDX;
@2:
// L <<< move[i];
	LEA ESI,Key56;
	LEA EDI,KeyTemp;
	XOR ECX,ECX;
	LEA EBX,KeyShift;
	MOV BYTE PTR CL, [EDX][EBX];
	REP MOVSB;

	LEA EDI, Key56;
	MOV ESI, EDI;
	MOV CL, [EBX][EDX];
	ADD ESI, ECX;
	MOV ECX, 28;
	SUB CL, [EBX][EDX];
	REP MOVSB;

	LEA ESI, KeyTemp;
	MOV CL, [EBX][EDX];
	REP MOVSB;

// R <<< move[i];
	LEA ESI,Key56[28];
	LEA EDI,KeyTemp;
	XOR ECX,ECX;
	LEA EBX,KeyShift;
	MOV BYTE PTR CL, [EDX][EBX];
	REP MOVSB;

	LEA EDI, Key56[28];
	MOV ESI, EDI;
	MOV CL, [EBX][EDX];
	ADD ESI, ECX;
	MOV ECX, 28;
	SUB CL, [EBX][EDX];
	REP MOVSB;

	LEA ESI, KeyTemp;
	MOV CL, [EBX][EDX];
	REP MOVSB;


// Get48Bits
	MOV EAX, EDX;
	IMUL EAX, 48;
	MOV EDI, KeyDataAdr;
	ADD EDI, EAX;
	LEA ESI, Key56;
	LEA EBX, Idx48In56;
	XOR EAX, EAX;
	XOR ECX, ECX;
@3:
	MOV AL, [EBX][ESI];
	DEC AL;
	MOV CL, [ESI][EAX];
	MOV [EDI][ESI], CL;
	INC CH;
	CMP CH, 56;
	JL @3;

	INC EDX;
	CMP EDX, 16;
	JL @2;
	end;

	end.


 

下面是我用这几个函数做的DES加密的一个实现(生成密钥数据时没有用标准的DES方法):
unit DesEncryptor;

interface

uses
Classes, SysUtils;

type
EDesError = class(Exception)
end;

TDesEncryptor = class
private
KeyData: array [0..15] of array [0..47] of Byte;
Key: String;
procedure MakeKeyData;
public
function GetMaxEncodeSize(DataSize:Integer): Integer;
//计算对DataSize字节的明文加密后密文的最大长度
function GetMaxDecodeSize(DataSize:Integer): Integer;
//计算对DataSize字节的密文解密后明文的最大长度
function EncodeMem(var Data; DataSize: Integer):Integer;
//对Data中DataSize字节的数据加密,密文存放在Data中,返回回值为密文长度。
function DecodeMem(var Data; DataSize: Integer):Integer;
//对Data中的DataSize字节的数据解密,明文存放在Data中,返回值为明文长度。
procedure EncodeVar(var Data: OleVariant);
//对Data加密,Data应为Variant Array of Byte类型,密文存放在Data中,
//Data的元素个数将发生变化,因此不能是被锁住的。。
procedure DecodeVar(var Data: OleVariant);
//对Data加密,Data应为Variant Array of Byte类型,密文存放在Data中,
//Data的元素个数将发生变化,因此不能是被锁住的。。
procedure Encode(const InStream, OutStream: TStream);
//对InStream中的内容加密,密文存入OutStream中。InStream和OutStream可以是同一对象。
procedure Decode(const InStream, OutStream: TStream);
//对InStream中的内容加密,密文存入OutStream中。InStream和OutStream可以是同一对象。
procedure SetKey(theKey: String);
{ Protected declarations }
public
constructor Create;
destructor Destroy; override;
end;

implementation


uses MD5, DesUtil, Windows, Variants;

type
TByteAry = array [0..32767] of Byte;
PByteAry = ^TByteAry;
TByteVarAry = array of Byte;
PByteVarAry = ^TByteVarAry;

resourcestring
SErrorDesBadcryptograph = '密文已被损坏,无法解密。';

function FindByteBack(Pattern: Byte; const Data; DataSize: Integer): Integer; assembler;

asm

	PUSH EDI;
	LEA EDI, [EDX + ECX - 1];
	STD;
	CMP ECX, 1;

⌨️ 快捷键说明

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