📄 deccipher.pas
字号:
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
SubKey := FUser;
Box := @SubKey[40];
SetupKey;
if Size = 16 then SetupBox128 else
if Size = 24 then SetupBox192
else SetupBox256;
end;
procedure TCipher_Twofish.DoEncode(Source, Dest: Pointer; Size: Integer);
var
S: PLongArray;
Box: PTwofishBox;
I,X,Y: LongWord;
A,B,C,D: TLongRec;
begin
Assert(Size = Context.BlockSize);
S := FUser;
A.L := PLongArray(Source)[0] xor S[0];
B.L := PLongArray(Source)[1] xor S[1];
C.L := PLongArray(Source)[2] xor S[2];
D.L := PLongArray(Source)[3] xor S[3];
Box := @S[40];
S := @S[8];
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];
D.L := D.L shl 1 or D.L shr 31;
C.L := C.L xor (X + Y + S[0]);
D.L := D.L xor (X + Y shl 1 + S[1]);
C.L := C.L shr 1 or C.L shl 31;
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];
B.L := B.L shl 1 or B.L shr 31;
A.L := A.L xor (X + Y + S[2]);
B.L := B.L xor (X + Y shl 1 + S[3]);
A.L := A.L shr 1 or A.L shl 31;
S := @S[4];
end;
S := FUser;
PLongArray(Dest)[0] := C.L xor S[4];
PLongArray(Dest)[1] := D.L xor S[5];
PLongArray(Dest)[2] := A.L xor S[6];
PLongArray(Dest)[3] := B.L xor S[7];
end;
procedure TCipher_Twofish.DoDecode(Source, Dest: Pointer; Size: Integer);
var
S: PLongArray;
Box: PTwofishBox;
I,X,Y: LongWord;
A,B,C,D: TLongRec;
begin
Assert(Size = Context.BlockSize);
S := FUser;
Box := @S[40];
C.L := PLongArray(Source)[0] xor S[4];
D.L := PLongArray(Source)[1] xor S[5];
A.L := PLongArray(Source)[2] xor S[6];
B.L := PLongArray(Source)[3] xor S[7];
S := @S[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];
A.L := A.L shl 1 or A.L shr 31;
B.L := B.L xor (X + Y shl 1 + S[3]);
A.L := A.L xor (X + Y + S[2]);
B.L := B.L shr 1 or B.L shl 31;
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];
C.L := C.L shl 1 or C.L shr 31;
D.L := D.L xor (X + Y shl 1 + S[1]);
C.L := C.L xor (X + Y + S[0]);
D.L := D.L shr 1 or D.L shl 31;
Dec(PLongWord(S), 4);
end;
S := FUser;
PLongArray(Dest)[0] := A.L xor S[0];
PLongArray(Dest)[1] := B.L xor S[1];
PLongArray(Dest)[2] := C.L xor S[2];
PLongArray(Dest)[3] := D.L xor S[3];
end;
// .TCipher_IDEA
class function TCipher_IDEA.Context: TCipherContext;
begin
Result.KeySize := 16;
Result.BufferSize := 8;
Result.BlockSize := 8;
Result.UserSize := 208;
Result.UserSave := False;
end;
procedure TCipher_IDEA.DoInit(const Key; Size: Integer);
function IDEAInv(X: Word): Word;
var
A, B, C, D: Word;
begin
if X <= 1 then
begin
Result := X;
Exit;
end;
A := 1;
B := $10001 div X;
C := $10001 mod X;
while C <> 1 do
begin
D := X div C;
X := X mod C;
Inc(A, B * D);
if X = 1 then
begin
Result := A;
Exit;
end;
D := C div X;
C := C mod X;
Inc(B, A * D);
end;
Result := 1 - B;
end;
var
I: Integer;
E: PWordArray;
A,B,C: Word;
K,D: PWordArray;
begin
E := FUser;
Move(Key, E^, Size);
for I := 0 to 7 do E[I] := Swap(E[I]);
for I := 0 to 39 do
E[I + 8] := E[I and not 7 + (I + 1) and 7] shl 9 or
E[I and not 7 + (I + 2) and 7] shr 7;
for I := 41 to 44 do
E[I + 7] := E[I] shl 9 or E[I + 1] shr 7;
K := E;
D := @E[100];
A := IDEAInv(K[0]);
B := 0 - K[1];
C := 0 - K[2];
D[3] := IDEAInv(K[3]);
D[2] := C;
D[1] := B;
D[0] := A;
Inc(PWord(K), 4);
for I := 1 to 8 do
begin
Dec(PWord(D), 6);
A := K[0];
D[5] := K[1];
D[4] := A;
A := IDEAInv(K[2]);
B := 0 - K[3];
C := 0 - K[4];
D[3] := IDEAInv(K[5]);
D[2] := B;
D[1] := C;
D[0] := A;
Inc(PWord(K), 6);
end;
A := D[2];
D[2] := D[1];
D[1] := A;
end;
function IDEAMul(X,Y: LongWord): LongWord;
asm
AND EAX,0FFFFh
JZ @@1
AND EDX,0FFFFh
JZ @@1
MUL EDX
MOV EDX,EAX
MOV ECX,EAX
SHR EDX,16
SUB EAX,EDX
SUB CX,AX
ADC EAX,0
RET
@@1: LEA EAX,[EAX + EDX -1]
NEG EAX
end;
procedure IDEACipher(Source, Dest: PLongArray; Key: PWordArray);
var
I: LongWord;
X,Y,A,B,C,D: LongWord;
begin
I := SwapLong(Source[0]);
A := I shr 16;
B := I and $FFFF;
I := SwapLong(Source[1]);
C := I shr 16;
D := I and $FFFF;
for I := 0 to 7 do
begin
A := IDEAMul(A, Key[0]);
Inc(B, Key[1]);
Inc(C, Key[2]);
D := IDEAMul(D, Key[3]);
Y := C xor A;
Y := IDEAMul(Y, Key[4]);
X := B xor D + Y;
X := IDEAMul(X, Key[5]);
Inc(Y, X);
A := A xor X;
D := D xor Y;
Y := B xor Y;
B := C xor X;
C := Y;
Key := @Key[6];
end;
Dest[0] := SwapLong(IDEAMul(A, Key[0]) shl 16 or (C + Key[1]) and $FFFF);
Dest[1] := SwapLong((B + Key[2]) shl 16 or IDEAMul(D, Key[3]) and $FFFF);
end;
procedure TCipher_IDEA.DoEncode(Source, Dest: Pointer; Size: Integer);
begin
Assert(Size = Context.BlockSize);
IDEACipher(Source, Dest, FUser);
end;
procedure TCipher_IDEA.DoDecode(Source, Dest: Pointer; Size: Integer);
begin
Assert(Size = Context.BlockSize);
IDEACipher(Source, Dest, @PLongArray(FUser)[26]);
end;
// .TCipher_Cast256
class function TCipher_Cast256.Context: TCipherContext;
begin
Result.KeySize := 32;
Result.BlockSize := 16;
Result.BufferSize := 16;
Result.UserSize := 384;
Result.UserSave := False;
end;
procedure TCipher_Cast256.DoInit(const Key; Size: Integer);
var
X: array[0..7] of LongWord;
M, R, I, J, T: LongWord;
K: PLongArray;
begin
FillChar(X, SizeOf(X), 0);
Move(Key, X, Size);
SwapLongBuffer(X, X, 8);
K := FUser;
M := $5A827999;
R := 19;
for I := 0 to 11 do
begin
for J := 0 to 1 do
begin
T := M + X[7];
T := T shl R or T shr (32 - R);
X[6] := X[6] xor (Cast256_Data[0, T shr 24] xor
Cast256_Data[1, T shr 16 and $FF] -
Cast256_Data[2, T shr 8 and $FF] +
Cast256_Data[3, T and $FF]);
Inc(M, $6ED9EBA1);
Inc(R, 17);
T := M xor X[6];
T := T shl R or T shr (32 - R);
X[5] := X[5] xor (Cast256_Data[0, T shr 24] -
Cast256_Data[1, T shr 16 and $FF] +
Cast256_Data[2, T shr 8 and $FF] xor
Cast256_Data[3, T and $FF]);
Inc(M, $6ED9EBA1);
Inc(R, 17);
T := M - X[5];
T := T shl R or T shr (32 - R);
X[4] := X[4] xor (Cast256_Data[0, T shr 24] +
Cast256_Data[1, T shr 16 and $FF] xor
Cast256_Data[2, T shr 8 and $FF] -
Cast256_Data[3, T and $FF]);
Inc(M, $6ED9EBA1);
Inc(R, 17);
T := M + X[4];
T := T shl R or T shr (32 - R);
X[3] := X[3] xor (Cast256_Data[0, T shr 24] xor
Cast256_Data[1, T shr 16 and $FF] -
Cast256_Data[2, T shr 8 and $FF] +
Cast256_Data[3, T and $FF]);
Inc(M, $6ED9EBA1);
Inc(R, 17);
T := M xor X[3];
T := T shl R or T shr (32 - R);
X[2] := X[2] xor (Cast256_Data[0, T shr 24] -
Cast256_Data[1, T shr 16 and $FF] +
Cast256_Data[2, T shr 8 and $FF] xor
Cast256_Data[3, T and $FF]);
Inc(M, $6ED9EBA1);
Inc(R, 17);
T := M - X[2];
T := T shl R or T shr (32 - R);
X[1] := X[1] xor (Cast256_Data[0, T shr 24] +
Cast256_Data[1, T shr 16 and $FF] xor
Cast256_Data[2, T shr 8 and $FF] -
Cast256_Data[3, T and $FF]);
Inc(M, $6ED9EBA1);
Inc(R, 17);
T := M + X[1];
T := T shl R or T shr (32 - R);
X[0] := X[0] xor (Cast256_Data[0, T shr 24] xor
Cast256_Data[1, T shr 16 and $FF] -
Cast256_Data[2, T shr 8 and $FF] +
Cast256_Data[3, T and $FF]);
Inc(M, $6ED9EBA1);
Inc(R, 17);
T := M xor X[0];
T := T shl R or T shr (32 - R);
X[7] := X[7] xor (Cast256_Data[0, T shr 24] -
Cast256_Data[1, T shr 16 and $FF] +
Cast256_Data[2, T shr 8 and $FF] xor
Cast256_Data[3, T and $FF]);
Inc(M, $6ED9EBA1);
Inc(R, 17);
end;
if I < 6 then
begin
K[48] := X[0] and $1F;
K[49] := X[2] and $1F;
K[50] := X[4] and $1F;
K[51] := X[6] and $1F;
K[0] := X[7];
K[1] := X[5];
K[2] := X[3];
K[3] := X[1];
end else
begin
K[48] := X[6] and $1F;
K[49] := X[4] and $1F;
K[50] := X[2] and $1F;
K[51] := X[0] and $1F;
K[0] := X[1];
K[1] := X[3];
K[2] := X[5];
K[3] := X[7];
end;
K := @K[4];
end;
ProtectBuffer(X, SizeOf(X));
end;
procedure TCipher_Cast256.DoEncode(Source, Dest: Pointer; Size: Integer);
v
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -