?? myldbcipher.pas
字號:
XOR EBP,EDX
MOV EDX,EAX
MOV EBX,EBP
DEC EDI
JNZ @@1
POP EAX
XOR EDX,[ESI + 4 * 256 * 4]
XCHG BL,BH // BSWAP
XCHG DL,DH
ROL EBX,16
ROL EDX,16
XCHG BL,BH
XCHG DL,DH
MOV [EAX],EDX
MOV [EAX + 4],EBX
POP EBP
POP EBX
POP ESI
POP EDI
end;
{$ENDIF} //486GE
{$ENDIF}
procedure TCipher_Blowfish.Encode(Data: Pointer);
{$IFDEF UseASM} // specialy for CPU >= 486
asm
PUSH EDI
PUSH ESI
PUSH EBX
PUSH EBP
PUSH EDX
MOV ESI,[EAX].TCipher_Blowfish.FUser
MOV EBX,[EDX] // A
MOV EBP,[EDX + 4] // B
BSWAP EBX // CPU >= 486
BSWAP EBP
XOR EDI,EDI
XOR EBX,[ESI + 4 * 256 * 4]
// XOR ECX,ECX
@@1:
MOV EAX,EBX
SHR EBX,16
MOVZX ECX,BH // it's faster with AMD Chips,
// MOV CL,BH // it's faster with PII's
MOV EDX,[ESI + ECX * 4 + 1024 * 0]
MOVZX ECX,BL
// MOV CL,BL
ADD EDX,[ESI + ECX * 4 + 1024 * 1]
MOVZX ECX,AH
// MOV CL,AH
XOR EDX,[ESI + ECX * 4 + 1024 * 2]
MOVZX ECX,AL
// MOV CL,AL
ADD EDX,[ESI + ECX * 4 + 1024 * 3]
XOR EBP,[ESI + 4 * 256 * 4 + 4 + EDI * 4]
INC EDI
XOR EDX,EBP
TEST EDI,010h
MOV EBP,EAX
MOV EBX,EDX
JZ @@1
POP EAX
XOR EBP,[ESI + 4 * 256 * 4 + 17 * 4]
BSWAP EBX
BSWAP EBP
MOV [EAX],EBP
MOV [EAX + 4],EBX
POP EBP
POP EBX
POP ESI
POP EDI
end;
{$ELSE}
var
I,A,B: LongWord;
P: PIntArray;
D: PBlowfish;
begin
D := User;
P := Pointer(PChar(User) + SizeOf(Blowfish_Data));
A := SwapInteger(PCipherRec(Data).A) xor P[0]; Inc(PInteger(P));
B := SwapInteger(PCipherRec(Data).B);
for I := 0 to 7 do
begin
B := B xor P[0] xor (D[0, A shr 24 ] +
D[1, A shr 16 and $FF] xor
D[2, A shr 8 and $FF] +
D[3, A and $FF]);
A := A xor P[1] xor (D[0, B shr 24 ] +
D[1, B shr 16 and $FF] xor
D[2, B shr 8 and $FF] +
D[3, B and $FF]);
Inc(PInteger(P), 2);
end;
PCipherRec(Data).A := SwapInteger(B xor P[0]);
PCipherRec(Data).B := SwapInteger(A);
end;
{$ENDIF}
procedure TCipher_Blowfish.Decode(Data: Pointer);
{$IFDEF UseASM}
asm
PUSH EDI
PUSH ESI
PUSH EBX
PUSH EBP
PUSH EDX
MOV ESI,[EAX].TCipher_Blowfish.FUser
MOV EBX,[EDX] // A
MOV EBP,[EDX + 4] // B
BSWAP EBX
BSWAP EBP
XOR EBX,[ESI + 4 * 256 * 4 + 17 * 4]
MOV EDI,16
// XOR ECX,ECX
@@1: MOV EAX,EBX
SHR EBX,16
MOVZX ECX,BH
// MOV CL,BH
MOV EDX,[ESI + ECX * 4 + 1024 * 0]
MOVZX ECX,BL
// MOV CL,BL
ADD EDX,[ESI + ECX * 4 + 1024 * 1]
MOVZX ECX,AH
// MOV CL,AH
XOR EDX,[ESI + ECX * 4 + 1024 * 2]
MOVZX ECX,AL
// MOV CL,AL
ADD EDX,[ESI + ECX * 4 + 1024 * 3]
XOR EBP,[ESI + 4 * 256 * 4 + EDI * 4]
XOR EDX,EBP
DEC EDI
MOV EBP,EAX
MOV EBX,EDX
JNZ @@1
POP EAX
XOR EBP,[ESI + 4 * 256 * 4]
BSWAP EBX
BSWAP EBP
MOV [EAX],EBP
MOV [EAX + 4],EBX
POP EBP
POP EBX
POP ESI
POP EDI
end;
{$ELSE}
var
I,A,B: LongWord;
P: PIntArray;
D: PBlowfish;
begin
D := User;
P := Pointer(PChar(User) + SizeOf(Blowfish_Data) + SizeOf(Blowfish_Key) - SizeOf(Integer));
A := SwapInteger(PCipherRec(Data).A) xor P[0];
B := SwapInteger(PCipherRec(Data).B);
for I := 0 to 7 do
begin
Dec(PInteger(P), 2);
B := B xor P[1] xor (D[0, A shr 24 ] +
D[1, A shr 16 and $FF] xor
D[2, A shr 8 and $FF] +
D[3, A and $FF]);
A := A xor P[0] xor (D[0, B shr 24 ] +
D[1, B shr 16 and $FF] xor
D[2, B shr 8 and $FF] +
D[3, B and $FF]);
end;
Dec(PInteger(P));
PCipherRec(Data).A := SwapInteger(B xor P[0]);
PCipherRec(Data).B := SwapInteger(A);
end;
{$ENDIF}
procedure TCipher_Blowfish.Init(const Key; Size: Integer; IVector: Pointer);
var
I,J: Integer;
B: array[0..7] of Byte;
K: PByteArray;
P: PIntArray;
S: PBlowfish;
begin
InitBegin(Size);
K := @Key;
S := User;
P := Pointer(PChar(User) + SizeOf(Blowfish_Data));
Move(Blowfish_Data, S^, SizeOf(Blowfish_Data));
Move(Blowfish_Key, P^, Sizeof(Blowfish_Key));
J := 0;
for I := 0 to 17 do
begin
P[I] := P[I] xor (K[(J + 0) mod Size] shl 24 +
K[(J + 1) mod Size] shl 16 +
K[(J + 2) mod Size] shl 8 +
K[(J + 3) mod Size]);
J := (J + 4) mod Size;
end;
FillChar(B, SizeOf(B), 0);
for I := 0 to 8 do
begin
Encode(@B);
P[I * 2] := SwapInteger(PCipherRec(@B).A);
P[I * 2 + 1] := SwapInteger(PCipherRec(@B).B);
end;
for I := 0 to 3 do
for J := 0 to 127 do
begin
Encode(@B);
S[I, J * 2] := SwapInteger(PCipherRec(@B).A);
S[I, J * 2 +1] := SwapInteger(PCipherRec(@B).B);
end;
FillChar(B, SizeOf(B), 0);
InitEnd(IVector);
end; {Blowfish}
{DES}
procedure DES_Func(Data: PIntArray; Key: PInteger); register;
var
L,R,X,Y,I: LongWord;
begin
L := SwapInteger(Data[0]);
R := SwapInteger(Data[1]);
X := (L shr 4 xor R) and $0F0F0F0F; R := R xor X; L := L xor X shl 4;
X := (L shr 16 xor R) and $0000FFFF; R := R xor X; L := L xor X shl 16;
X := (R shr 2 xor L) and $33333333; L := L xor X; R := R xor X shl 2;
X := (R shr 8 xor L) and $00FF00FF; L := L xor X; R := R xor X shl 8;
R := R shl 1 or R shr 31;
X := (L xor R) and $AAAAAAAA;
R := R xor X;
L := L xor X;
L := L shl 1 or L shr 31;
for I := 0 to 7 do
begin
X := (R shl 28 or R shr 4) xor Key^; Inc(Key);
Y := R xor Key^; Inc(Key);
L := L xor (DES_Data[0, X and $3F] or DES_Data[1, X shr 8 and $3F] or
DES_Data[2, X shr 16 and $3F] or DES_Data[3, X shr 24 and $3F] or
DES_Data[4, Y and $3F] or DES_Data[5, Y shr 8 and $3F] or
DES_Data[6, Y shr 16 and $3F] or DES_Data[7, Y shr 24 and $3F]);
X := (L shl 28 or L shr 4) xor Key^; Inc(Key);
Y := L xor Key^; Inc(Key);
R := R xor (DES_Data[0, X and $3F] or DES_Data[1, X shr 8 and $3F] or
DES_Data[2, X shr 16 and $3F] or DES_Data[3, X shr 24 and $3F] or
DES_Data[4, Y and $3F] or DES_Data[5, Y shr 8 and $3F] or
DES_Data[6, Y shr 16 and $3F] or DES_Data[7, Y shr 24 and $3F]);
end;
R := R shl 31 or R shr 1;
X := (L xor R) and $AAAAAAAA;
R := R xor X;
L := L xor X;
L := L shl 31 or L shr 1;
X := (L shr 8 xor R) and $00FF00FF; R := R xor X; L := L xor X shl 8;
X := (L shr 2 xor R) and $33333333; R := R xor X; L := L xor X shl 2;
X := (R shr 16 xor L) and $0000FFFF; L := L xor X; R := R xor X shl 16;
X := (R shr 4 xor L) and $0F0F0F0F; L := L xor X; R := R xor X shl 4;
Data[0] := SwapInteger(R);
Data[1] := SwapInteger(L);
end;
class procedure TCipher_1DES.GetContext(var ABufSize, AKeySize, AUserSize: Integer);
begin
ABufSize := 8;
AKeySize := 8;
AUserSize := 32 * 4 * 2;
end;
class function TCipher_1DES.TestVector: Pointer;
asm
MOV EAX,OFFSET @Vector
RET
@Vector: DB 0ADh,069h,042h,0BBh,0F6h,068h,020h,04Dh
DB 053h,0CDh,0C7h,062h,013h,093h,098h,0C0h
DB 030h,00Dh,085h,00Bh,0E2h,0AAh,072h,009h
DB 06Fh,0DBh,05Fh,08Eh,0D3h,0E4h,0CFh,08Ah
end;
procedure TCipher_1DES.Encode(Data: Pointer);
begin
DES_Func(Data, User);
end;
procedure TCipher_1DES.Decode(Data: Pointer);
begin
DES_Func(Data, @PIntArray(User)[32]);
end;
procedure TCipher_1DES.MakeKey(const Data : array of byte; Key_1: pointer; Reverse: Boolean);
//MakeKey(const Data: array of Byte; Key: PInteger; Reverse: Boolean);
const
ROT: array[0..15] of Byte = (1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28);
var
I,J,L,M,N: LongWord;
PC_M, PC_R: array[0..55] of Byte;
K: array[0..31] of LongWord;
Key: PInteger;
begin
Key := PInteger(Key_1);
FillChar(K, SizeOf(K), 0);
for I := 0 to 55 do
if Data[DES_PC1[I] shr 3] and ($80 shr (DES_PC1[I] and $07)) <> 0 then PC_M[I] := 1
else PC_M[I] := 0;
for I := 0 to 15 do
begin
if Reverse then M := (15 - I) shl 1 else M := I shl 1;
N := M + 1;
for J := 0 to 27 do
begin
L := J + ROT[I];
if L < 28 then PC_R[J] := PC_M[L] else PC_R[J] := PC_M[L - 28];
end;
for J := 28 to 55 do
begin
L := J + ROT[I];
if L < 56 then PC_R[J] := PC_M[L] else PC_R[J] := PC_M[L - 28];
end;
L := $1000000;
for J := 0 to 23 do
begin
L := L shr 1;
if PC_R[DES_PC2[J ]] <> 0 then K[M] := K[M] or L;
if PC_R[DES_PC2[J + 24]] <> 0 then K[N] := K[N] or L;
end;
end;
for I := 0 to 15 do
begin
M := I shl 1; N := M + 1;
Key^ := K[M] and $00FC0000 shl 6 or
K[M] and $00000FC0 shl 10 or
K[N] and $00FC0000 shr 10 or
K[N] and $00000FC0 shr 6;
Inc(Key);
Key^ := K[M] and $0003F000 shl 12 or
K[M] and $0000003F shl 16 or
K[N] and $0003F000 shr 4 or
K[N] and $0000003F;
Inc(Key);
end;
end;
procedure TCipher_1DES.Init(const Key; Size: Integer; IVector: Pointer);
var
K: array[0..7] of Byte;
begin
InitBegin(Size);
FillChar(K, SizeOf(K), 0);
Move(Key, K, Size);
MakeKey(K, User, False);
MakeKey(K, @PIntArray(User)[32], True);
FillChar(K, SizeOf(K), 0);
InitEnd(IVector);
end;
class procedure TCipher_3DES.GetContext(var ABufSize, AKeySize, AUserSize: Integer);
begin
ABufSize := 8;
AKeySize := 24;
AUserSize := 32 * 4 * 2 * 3;
end;
class function TCipher_3DES.TestVector: Pointer;
asm
MOV EAX,OFFSET @Vector
RET
@Vector: DB 007h,04Ch,014h,0F3h,0E2h,02Eh,008h,0D9h
DB 064h,0BFh,06Fh,082h,0B5h,0DFh,0F0h,0A2h
DB 02Fh,02Dh,03Bh,0DBh,017h,0DBh,025h,0B6h
DB 0B5h,01Eh,0FAh,071h,037h,02Fh,0D1h,072h
end;
procedure TCipher_3DES.Encode(Data: Pointer);
begin
DES_Func(Data, User);
DES_Func(Data, @PIntArray(User)[32]);
DES_Func(Data, @PIntArray(User)[64]);
end;
procedure TCipher_3DES.Decode(Data: Pointer);
begin
DES_Func(Data, @PIntArray(User)[96]);
DES_Func(Data, @PIntArray(User)[128]);
DES_Func(Data, @PIntArray(User)[160]);
end;
procedure TCipher_3DES.Init(const Key; Size: Integer; IVector: Pointer);
var
K: array[0..23] of Byte;
P: PInteger;
begin
InitBegin(Size);
FillChar(K, SizeOf(K), 0);
Move(Key, K, Size);
P := User;
MakeKey(K[ 0], P, False); Inc(P, 32);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -