📄 新建 文本文档 (3).txt
字号:
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 + -