?? myldbcipher.pas
字號:
MakeKey(K[ 8], P, True); Inc(P, 32);
MakeKey(K[16], P, False); Inc(P, 32);
MakeKey(K[16], P, True); Inc(P, 32);
MakeKey(K[ 8], P, False); Inc(P, 32);
MakeKey(K[ 0], P, True);
FillChar(K, SizeOf(K), 0);
InitEnd(IVector);
end;
class procedure TCipher_3TDES.GetContext(var ABufSize, AKeySize, AUserSize: Integer);
begin
inherited GetContext(ABufSize, AKeySize, AUserSize);
ABufSize := 24;
end;
class function TCipher_3TDES.TestVector: Pointer;
asm
MOV EAX,OFFSET @Vector
RET
@Vector: DB 00Bh,012h,0E4h,08Bh,0D9h,0CDh,008h,0BFh
DB 0CAh,0AEh,03Eh,05Fh,0F6h,0FEh,013h,0CDh
DB 03Fh,070h,06Eh,0CDh,053h,056h,03Fh,05Ah
DB 080h,00Fh,01Bh,01Eh,0FBh,09Ah,057h,096h
end;
procedure TCipher_3TDES.Encode(Data: Pointer);
var
T: Integer;
begin
DES_Func(@PIntArray(Data)[0], User);
DES_Func(@PIntArray(Data)[2], User);
DES_Func(@PIntArray(Data)[4], User);
T := PIntArray(Data)[1]; PIntArray(Data)[1] := PIntArray(Data)[2]; PIntArray(Data)[2] := T;
T := PIntArray(Data)[3]; PIntArray(Data)[3] := PIntArray(Data)[4]; PIntArray(Data)[3] := T;
DES_Func(@PIntArray(Data)[0], @PIntArray(User)[32]);
DES_Func(@PIntArray(Data)[2], @PIntArray(User)[32]);
DES_Func(@PIntArray(Data)[4], @PIntArray(User)[32]);
T := PIntArray(Data)[1]; PIntArray(Data)[1] := PIntArray(Data)[2]; PIntArray(Data)[2] := T;
T := PIntArray(Data)[3]; PIntArray(Data)[3] := PIntArray(Data)[4]; PIntArray(Data)[3] := T;
DES_Func(@PIntArray(Data)[0], @PIntArray(User)[64]);
DES_Func(@PIntArray(Data)[2], @PIntArray(User)[64]);
DES_Func(@PIntArray(Data)[4], @PIntArray(User)[64]);
end;
procedure TCipher_3TDES.Decode(Data: Pointer);
var
T: Integer;
begin
DES_Func(@PIntArray(Data)[0], @PIntArray(User)[96]);
DES_Func(@PIntArray(Data)[2], @PIntArray(User)[96]);
DES_Func(@PIntArray(Data)[4], @PIntArray(User)[96]);
T := PIntArray(Data)[1]; PIntArray(Data)[1] := PIntArray(Data)[2]; PIntArray(Data)[2] := T;
T := PIntArray(Data)[3]; PIntArray(Data)[3] := PIntArray(Data)[4]; PIntArray(Data)[3] := T;
DES_Func(@PIntArray(Data)[0], @PIntArray(User)[128]);
DES_Func(@PIntArray(Data)[2], @PIntArray(User)[128]);
DES_Func(@PIntArray(Data)[4], @PIntArray(User)[128]);
T := PIntArray(Data)[1]; PIntArray(Data)[1] := PIntArray(Data)[2]; PIntArray(Data)[2] := T;
T := PIntArray(Data)[3]; PIntArray(Data)[3] := PIntArray(Data)[4]; PIntArray(Data)[3] := T;
DES_Func(@PIntArray(Data)[0], @PIntArray(User)[160]);
DES_Func(@PIntArray(Data)[2], @PIntArray(User)[160]);
DES_Func(@PIntArray(Data)[4], @PIntArray(User)[160]);
end;
class procedure TCipher_Twofish.GetContext(var ABufSize, AKeySize, AUserSize: Integer);
begin
ABufSize := 16;
AKeySize := 32;
AUserSize := 4256;
end;
class function TCipher_Twofish.TestVector: Pointer;
asm
MOV EAX,OFFSET @Vector
RET
@Vector: DB 0A5h,053h,057h,003h,0EFh,033h,048h,079h
DB 09Fh,022h,0B4h,054h,097h,005h,084h,019h
DB 087h,0BDh,083h,01Ch,04Dh,0AEh,012h,013h
DB 060h,07Ch,07Ch,0D1h,098h,045h,002h,019h
end;
type
PTwofishBox = ^TTwofishBox;
TTwofishBox = array[0..3, 0..255] of Longword;
TLongRec = record
case Integer of
0: (L: Longword);
1: (A,B,C,D: Byte);
end;
procedure TCipher_Twofish.Encode(Data: Pointer);
var
S: PIntArray;
Box: PTwofishBox;
I,X,Y: LongWord;
A,B,C,D: TLongRec;
begin
S := User;
A.L := PIntArray(Data)[0] xor S[0];
B.L := PIntArray(Data)[1] xor S[1];
C.L := PIntArray(Data)[2] xor S[2];
D.L := PIntArray(Data)[3] xor S[3];
S := @PIntArray(User)[8];
Box := @PIntArray(User)[40];
for I := 0 to 7 do
begin
X := Box[0, A.A] xor Box[1, A.B] xor Box[2, A.C] xor Box[3, A.D];
Y := Box[1, B.A] xor Box[2, B.B] xor Box[3, B.C] xor Box[0, B.D];
asm ROL D.L,1 end;
C.L := C.L xor (X + Y + S[0]);
D.L := D.L xor (X + Y shl 1 + S[1]);
asm ROR C.L,1 end;
X := Box[0, C.A] xor Box[1, C.B] xor Box[2, C.C] xor Box[3, C.D];
Y := Box[1, D.A] xor Box[2, D.B] xor Box[3, D.C] xor Box[0, D.D];
asm ROL B.L,1 end;
A.L := A.L xor (X + Y + S[2]);
B.L := B.L xor (X + Y shl 1 + S[3]);
asm ROR A.L,1 end;
Inc(PInteger(S), 4);
end;
S := User;
PIntArray(Data)[0] := C.L xor S[4];
PIntArray(Data)[1] := D.L xor S[5];
PIntArray(Data)[2] := A.L xor S[6];
PIntArray(Data)[3] := B.L xor S[7];
end;
procedure TCipher_Twofish.Decode(Data: Pointer);
var
S: PIntArray;
Box: PTwofishBox;
I,X,Y: LongWord;
A,B,C,D: TLongRec;
begin
S := User;
Box := @PIntArray(User)[40];
C.L := PIntArray(Data)[0] xor S[4];
D.L := PIntArray(Data)[1] xor S[5];
A.L := PIntArray(Data)[2] xor S[6];
B.L := PIntArray(Data)[3] xor S[7];
S := @PIntArray(User)[36];
for I := 0 to 7 do
begin
X := Box[0, C.A] xor Box[1, C.B] xor Box[2, C.C] xor Box[3, C.D];
Y := Box[0, D.D] xor Box[1, D.A] xor Box[2, D.B] xor Box[3, D.C];
asm ROL A.L,1 end;
B.L := B.L xor (X + Y shl 1 + S[3]);
A.L := A.L xor (X + Y + S[2]);
asm ROR B.L,1 end;
X := Box[0, A.A] xor Box[1, A.B] xor Box[2, A.C] xor Box[3, A.D];
Y := Box[0, B.D] xor Box[1, B.A] xor Box[2, B.B] xor Box[3, B.C];
asm ROL C.L,1 end;
D.L := D.L xor (X + Y shl 1 + S[1]);
C.L := C.L xor (X + Y + S[0]);
asm ROR D.L,1 end;
Dec(PByte(S),16);
end;
S := User;
PIntArray(Data)[0] := A.L xor S[0];
PIntArray(Data)[1] := B.L xor S[1];
PIntArray(Data)[2] := C.L xor S[2];
PIntArray(Data)[3] := D.L xor S[3];
end;
procedure TCipher_Twofish.Init(const Key; Size: Integer; IVector: Pointer);
var
BoxKey: array[0..3] of TLongRec;
SubKey: PIntArray;
Box: PTwofishBox;
procedure SetupKey;
function Encode(K0, K1: Integer): Integer;
var
R, I, J, G2, G3: Integer;
B: byte;
begin
R := 0;
for I := 0 to 1 do
begin
if I <> 0 then R := R xor K0 else R := R xor K1;
for J := 0 to 3 do
begin
B := R shr 24;
if B and $80 <> 0 then G2 := (B shl 1 xor $014D) and $FF
else G2 := B shl 1 and $FF;
if B and 1 <> 0 then G3 := (B shr 1 and $7F) xor $014D shr 1 xor G2
else G3 := (B shr 1 and $7F) xor G2;
R := R shl 8 xor G3 shl 24 xor G2 shl 16 xor G3 shl 8 xor B;
end;
end;
Result := R;
end;
function F32(X: Integer; K: array of Integer): Integer;
var
A, B, C, D: Integer;
begin
A := X and $FF;
B := X shr 8 and $FF;
C := X shr 16 and $FF;
D := X shr 24;
if Size = 32 then
begin
A := Twofish_8x8[1, A] xor K[3] and $FF;
B := Twofish_8x8[0, B] xor K[3] shr 8 and $FF;
C := Twofish_8x8[0, C] xor K[3] shr 16 and $FF;
D := Twofish_8x8[1, D] xor K[3] shr 24;
end;
if Size >= 24 then
begin
A := Twofish_8x8[1, A] xor K[2] and $FF;
B := Twofish_8x8[1, B] xor K[2] shr 8 and $FF;
C := Twofish_8x8[0, C] xor K[2] shr 16 and $FF;
D := Twofish_8x8[0, D] xor K[2] shr 24;
end;
A := Twofish_8x8[0, A] xor K[1] and $FF;
B := Twofish_8x8[1, B] xor K[1] shr 8 and $FF;
C := Twofish_8x8[0, C] xor K[1] shr 16 and $FF;
D := Twofish_8x8[1, D] xor K[1] shr 24;
A := Twofish_8x8[0, A] xor K[0] and $FF;
B := Twofish_8x8[0, B] xor K[0] shr 8 and $FF;
C := Twofish_8x8[1, C] xor K[0] shr 16 and $FF;
D := Twofish_8x8[1, D] xor K[0] shr 24;
Result := Twofish_Data[0, A] xor Twofish_Data[1, B] xor
Twofish_Data[2, C] xor Twofish_Data[3, D];
end;
var
I,J,A,B: Integer;
E,O: array[0..3] of Integer;
K: array[0..7] of Integer;
begin
FillChar(K, SizeOf(K), 0);
Move(Key, K, Size);
if Size <= 16 then Size := 16 else
if Size <= 24 then Size := 24
else Size := 32;
J := Size shr 3 - 1;
for I := 0 to J do
begin
E[I] := K[I shl 1];
O[I] := K[I shl 1 + 1];
BoxKey[J].L := Encode(E[I], O[I]);
Dec(J);
end;
J := 0;
for I := 0 to 19 do
begin
A := F32(J, E);
B := ROL(F32(J + $01010101, O), 8);
SubKey[I shl 1] := A + B;
B := A + B shr 1;
SubKey[I shl 1 + 1] := ROL(B, 9);
Inc(J, $02020202);
end;
end;
procedure DoXOR(D, S: PIntArray; Value: LongWord);
var
I: LongWord;
begin
Value := (Value and $FF) * $01010101;
for I := 0 to 63 do D[I] := S[I] xor Value;
end;
procedure SetupBox128;
var
L: array[0..255] of Byte;
A,I: Integer;
begin
DoXOR(@L, @Twofish_8x8[0], BoxKey[1].L);
A := BoxKey[0].A;
for I := 0 to 255 do
Box[0, I] := Twofish_Data[0, Twofish_8x8[0, L[I]] xor A];
DoXOR(@L, @Twofish_8x8[1], BoxKey[1].L shr 8);
A := BoxKey[0].B;
for I := 0 to 255 do
Box[1, I] := Twofish_Data[1, Twofish_8x8[0, L[I]] xor A];
DoXOR(@L, @Twofish_8x8[0], BoxKey[1].L shr 16);
A := BoxKey[0].C;
for I := 0 to 255 do
Box[2, I] := Twofish_Data[2, Twofish_8x8[1, L[I]] xor A];
DoXOR(@L, @Twofish_8x8[1], BoxKey[1].L shr 24);
A := BoxKey[0].D;
for I := 0 to 255 do
Box[3, I] := Twofish_Data[3, Twofish_8x8[1, L[I]] xor A];
end;
procedure SetupBox192;
var
L: array[0..255] of Byte;
A,B,I: Integer;
begin
DoXOR(@L, @Twofish_8x8[1], BoxKey[2].L);
A := BoxKey[0].A;
B := BoxKey[1].A;
for I := 0 to 255 do
Box[0, I] := Twofish_Data[0, Twofish_8x8[0, Twofish_8x8[0, L[I]] xor B] xor A];
DoXOR(@L, @Twofish_8x8[1], BoxKey[2].L shr 8);
A := BoxKey[0].B;
B := BoxKey[1].B;
for I := 0 to 255 do
Box[1, I] := Twofish_Data[1, Twofish_8x8[0, Twofish_8x8[1, L[I]] xor B] xor A];
DoXOR(@L, @Twofish_8x8[0], BoxKey[2].L shr 16);
A := BoxKey[0].C;
B := BoxKey[1].C;
for I := 0 to 255 do
Box[2, I] := Twofish_Data[2, Twofish_8x8[1, Twofish_8x8[0, L[I]] xor B] xor A];
DoXOR(@L ,@Twofish_8x8[0], BoxKey[2].L shr 24);
A := BoxKey[0].D;
B := BoxKey[1].D;
for I := 0 to 255 do
Box[3, I] := Twofish_Data[3, Twofish_8x8[1, Twofish_8x8[1, L[I]] xor B] xor A];
end;
procedure SetupBox256;
var
L: array[0..255] of Byte;
K: array[0..255] of Byte;
A,B,I: Integer;
begin
DoXOR(@K, @Twofish_8x8[1], BoxKey[3].L);
for I := 0 to 255 do L[I] := Twofish_8x8[1, K[I]];
DoXOR(@L, @L, BoxKey[2].L);
A := BoxKey[0].A;
B := BoxKey[1].A;
for I := 0 to 255 do
Box[0, I] := Twofish_Data[0, Twofish_8x8[0, Twofish_8x8[0, L[I]] xor B] xor A];
DoXOR(@K, @Twofish_8x8[0], BoxKey[3].L shr 8);
for I := 0 to 255 do L[I] := Twofish_8x8[1, K[I]];
DoXOR(@L, @L, BoxKey[2].L shr 8);
A := BoxKey[0].B;
B := BoxKey[1].B;
for I := 0 to 255 do
Box[1, I] := Twofish_Data[1, Twofish_8x8[0, Twofish_8x8[1, L[I]] xor B] xor A];
DoXOR(@K, @Twofish_8x8[0],BoxKey[3].L shr 16);
for I := 0 to 255 do L[I] := Twofish_8x8[0, K[I]];
DoXOR(@L, @L, BoxKey[2].L shr 16);
A := BoxKey[0].C;
B := BoxKey[1].C;
for I := 0 to 255 do
Box[2, I] := Twofish_Data[2, Twofish_8x8[1, Twofish_8x8[0, L[I]] xor B] xor A];
DoXOR(@K, @Twofish_8x8[1], BoxKey[3].L shr 24);
for I := 0 to 255 do L[I] := Twofish_8x8[0, K[I]];
DoXOR(@L, @L, BoxKey[2].L shr 24);
A := BoxKey[0].D;
B := BoxKey[1].D;
for I := 0 to 255 do
Box[3, I] := Twofish_Data[3, Twofish_8x8[1, Twofish_8x8[1, L[I]] xor B] xor A];
end;
begin
InitBegin(Size);
SubKey := User;
Box := @SubKey[40];
SetupKey;
if Size = 16 then SetupBox128 else
if Size = 24 then SetupBox192
else SetupBox256;
InitEnd(IVector);
end;
class procedure TCipher_Square.GetContext(var ABufSize, AKeySize, AUserSize: Integer);
begin
ABufSize := 16;
AKeySize := 16;
AUserSize := 9 * 4 * 2 * SizeOf(LongWord);
end;
class function TCipher_Square.TestVector: Pointer;
asm
MOV EAX,OFFSET @Vector
RET
@Vector: DB 043h,09Ch,0A6h,0C4h,067h,0E8h,02Eh,047h
DB 022h,095h,066h,085h,006h,039h,06Ah,0C9h
DB 018h,021h,020h,0F7h,044h,036h,0F1h,061h
DB 07Dh,014h,090h,0B1h,0A9h,068h,056h,0C7h
end;
procedure TCipher_Square.Encode(Data: Pointer);
var
Key: PIntArray;
A,B,C,D: LongWord;
AA,BB,CC: LongWord;
I: Integer;
begin
Key := User;
A := PIntArray(Data)[0] xor Key[0];
B := PIntArray(Data)[1] xor Key[1];
C := PIntArray(Data)[2] xor Key[2];
D := PIntArray(Data)[3] xor Key[3];
Inc(PInteger(Key), 4);
for I := 0 to 6 do
begin
AA := Square_TE[0, A and $FF] xor
Square_TE[1, B and $FF] xor
Square_TE[2, C and $FF] xor
Square_TE[3, D and $FF] xor Key[0];
BB := Square_TE[0, A shr 8 and $FF] xor
Square_TE[1, B shr 8 and $FF] xor
Square_TE[2, C shr 8 and $FF] xor
Square_TE[3, D shr 8 and $FF] xor Key[1];
CC := Square_TE[0, A shr 16 and $FF] xor
Square_TE[1, B shr 16 and $FF] xor
Square_TE[2, C shr 16 and $FF] xor
Square_TE[3, D shr 16 and $FF] xor Key[2];
D := Square_TE[0, A shr 24 ] xor
Square_TE[1, B shr 24 ] xor
Square_TE[2, C shr 24 ] xor
Square_TE[3, D shr 24 ] xor Key[3];
Inc(PInteger(Key), 4);
A := AA; B := BB; C := CC;
end;
PIntArray(Data)[0] := LongWord(Square_SE[A and $FF]) xor
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -