📄 twofish.pas
字号:
end;
Xor256(@L0,@p8x8[p_12],(sboxKeys[1] shr 8) and $FF);
A:= (sboxKeys[0] shr 8) and $FF;
i:= 0;
while i< 256 do
begin
sBox[1 and 2,2*i+(1 and 1)]:= MDS[1,p8x8[p_11,L0[i]] xor A];
sBox[1 and 2,2*i+(1 and 1)+2]:= MDS[1,p8x8[p_11,L0[i+1]] xor A];
Inc(i,2);
end;
Xor256(@L0,@p8x8[p_22],(sboxKeys[1] shr 16) and $FF);
A:= (sboxKeys[0] shr 16) and $FF;
i:= 0;
while i< 256 do
begin
sBox[2 and 2,2*i+(2 and 1)]:= MDS[2,p8x8[p_21,L0[i]] xor A];
sBox[2 and 2,2*i+(2 and 1)+2]:= MDS[2,p8x8[p_21,L0[i+1]] xor A];
Inc(i,2);
end;
Xor256(@L0,@p8x8[p_32],(sboxKeys[1] shr 24));
A:= (sboxKeys[0] shr 24);
i:= 0;
while i< 256 do
begin
sBox[3 and 2,2*i+(3 and 1)]:= MDS[3,p8x8[p_31,L0[i]] xor A];
sBox[3 and 2,2*i+(3 and 1)+2]:= MDS[3,p8x8[p_31,L0[i+1]] xor A];
Inc(i,2);
end;
end;
192: begin
Xor256(@L0,@p8x8[p_03],sboxKeys[2] and $FF);
A:= sboxKeys[0] and $FF;
B:= sboxKeys[1] and $FF;
i:= 0;
while i< 256 do
begin
sBox[0 and 2,2*i+(0 and 1)]:= MDS[0,p8x8[p_01,p8x8[p_02,L0[i]] xor B] xor A];
sBox[0 and 2,2*i+(0 and 1)+2]:= MDS[0,p8x8[p_01,p8x8[p_02,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L0,@p8x8[p_13],(sboxKeys[2] shr 8) and $FF);
A:= (sboxKeys[0] shr 8) and $FF;
B:= (sboxKeys[1] shr 8) and $FF;
i:= 0;
while i< 256 do
begin
sBox[1 and 2,2*i+(1 and 1)]:= MDS[1,p8x8[p_11,p8x8[p_12,L0[i]] xor B] xor A];
sBox[1 and 2,2*i+(1 and 1)+2]:= MDS[1,p8x8[p_11,p8x8[p_12,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L0,@p8x8[p_23],(sboxKeys[2] shr 16) and $FF);
A:= (sboxKeys[0] shr 16) and $FF;
B:= (sboxKeys[1] shr 16) and $FF;
i:= 0;
while i< 256 do
begin
sBox[2 and 2,2*i+(2 and 1)]:= MDS[2,p8x8[p_21,p8x8[p_22,L0[i]] xor B] xor A];
sBox[2 and 2,2*i+(2 and 1)+2]:= MDS[2,p8x8[p_21,p8x8[p_22,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L0,@p8x8[p_33],(sboxKeys[2] shr 24));
A:= (sboxKeys[0] shr 24);
B:= (sboxKeys[1] shr 24);
i:= 0;
while i< 256 do
begin
sBox[3 and 2,2*i+(3 and 1)]:= MDS[3,p8x8[p_31,p8x8[p_32,L0[i]] xor B] xor A];
sBox[3 and 2,2*i+(3 and 1)+2]:= MDS[3,p8x8[p_31,p8x8[p_32,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
end;
256: begin
Xor256(@L1,@p8x8[p_04],(sboxKeys[3]) and $FF);
i:= 0;
while i< 256 do
begin
L0[i ]:= p8x8[p_03,L1[i]];
L0[i+1]:= p8x8[p_03,L1[i+1]];
Inc(i,2);
end;
Xor256(@L0,@L0,(sboxKeys[2]) and $FF);
A:= (sboxKeys[0]) and $FF;
B:= (sboxKeys[1]) and $FF;
i:= 0;
while i< 256 do
begin
sBox[0 and 2,2*i+(0 and 1)]:= MDS[0,p8x8[p_01,p8x8[p_02,L0[i]] xor B] xor A];
sBox[0 and 2,2*i+(0 and 1)+2]:= MDS[0,p8x8[p_01,p8x8[p_02,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L1,@p8x8[p_14],(sboxKeys[3] shr 8) and $FF);
i:= 0;
while i< 256 do
begin
L0[i ]:= p8x8[p_13,L1[i]];
L0[i+1]:= p8x8[p_13,L1[i+1]];
Inc(i,2);
end;
Xor256(@L0,@L0,(sboxKeys[2] shr 8) and $FF);
A:= (sboxKeys[0] shr 8) and $FF;
B:= (sboxKeys[1] shr 8) and $FF;
i:= 0;
while i< 256 do
begin
sBox[1 and 2,2*i+(1 and 1)]:= MDS[1,p8x8[p_11,p8x8[p_12,L0[i]] xor B] xor A];
sBox[1 and 2,2*i+(1 and 1)+2]:= MDS[1,p8x8[p_11,p8x8[p_12,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L1,@p8x8[p_24],(sboxKeys[3] shr 16) and $FF);
i:= 0;
while i< 256 do
begin
L0[i ]:= p8x8[p_23,L1[i]];
L0[i+1]:= p8x8[p_23,L1[i+1]];
Inc(i,2);
end;
Xor256(@L0,@L0,(sboxKeys[2] shr 16) and $FF);
A:= (sboxKeys[0] shr 16) and $FF;
B:= (sboxKeys[1] shr 16) and $FF;
i:= 0;
while i< 256 do
begin
sBox[2 and 2,2*i+(2 and 1)]:= MDS[2,p8x8[p_21,p8x8[p_22,L0[i]] xor B] xor A];
sBox[2 and 2,2*i+(2 and 1)+2]:= MDS[2,p8x8[p_21,p8x8[p_22,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
Xor256(@L1,@p8x8[p_34],(sboxKeys[3] shr 24));
i:= 0;
while i< 256 do
begin
L0[i ]:= p8x8[p_33,L1[i]];
L0[i+1]:= p8x8[p_33,L1[i+1]];
Inc(i,2);
end;
Xor256(@L0,@L0,(sboxKeys[2] shr 24));
A:= (sboxKeys[0] shr 24);
B:= (sboxKeys[1] shr 24);
i:= 0;
while i< 256 do
begin
sBox[3 and 2,2*i+(3 and 1)]:= MDS[3,p8x8[p_31,p8x8[p_32,L0[i]] xor B] xor A];
sBox[3 and 2,2*i+(3 and 1)+2]:= MDS[3,p8x8[p_31,p8x8[p_32,L0[i+1]] xor B] xor A];
Inc(i,2);
end;
end;
end;
if IVector= nil then
begin
FillChar(IV,Sizeof(IV),$FF);
{$IFDEF CFORM}Encrypt(IV,IV){$ELSE}TwofishEncryptECB(Data,IV,IV){$ENDIF};
Move(IV,LB,Sizeof(LB));
end
else
begin
Move(IVector^,IV,Sizeof(IV));
Move(IV,LB,Sizeof(IV));
end;
{$IFDEF CFORM}
fInitialized:= true;
{$ELSE}end;{$ENDIF}
end;
{$IFDEF CFORM}
procedure TDCP_twofish.Burn;
{$ELSE}
procedure TwofishBurn;
{$ENDIF}
begin
{$IFNDEF CFORM}with Data do begin{$ENDIF}
FillChar(sBox,Sizeof(sBox),$FF);
FillChar(sBoxKeys,Sizeof(sBoxKeys),$FF);
FillChar(SubKeys,Sizeof(SubKeys),$FF);
FillChar(IV,Sizeof(IV),$FF);
FillChar(LB,Sizeof(LB),$FF);
{$IFDEF CFORM}
fInitialized:= false;
{$ELSE}end;{$ENDIF}
end;
{$IFDEF CFORM}
procedure TDCP_twofish.Reset;
{$ELSE}
procedure TwofishReset;
{$ENDIF}
begin
{$IFNDEF CFORM}with Data do{$ENDIF}
Move(IV,LB,Sizeof(LB));
end;
{$IFDEF CFORM}
procedure TDCP_twofish.EncryptECB(const InBlock; var OutBlock);
begin
if not fInitialized then
raise Exception.Create('Twofish: Not initialized');
Encrypt(InBlock,OutBlock);
end;
procedure TDCP_twofish.DecryptECB(const InBlock; var OutBlock);
begin
if not fInitialized then
raise Exception.Create('Twofish: Not initialized');
Decrypt(InBlock,OutBlock);
end;
{$ENDIF}
{$IFDEF CFORM}
procedure TDCP_twofish.EncryptCBC(const InData; var OutData; Size: longint);
{$ELSE}
procedure TwofishEncryptCBC;
{$ENDIF}
var
TB: array[0..15] of byte;
i: longint;
begin
{$IFDEF CFORM}
if not fInitialized then
raise Exception.Create('Twofish: Not initialized');
{$ELSE}with Data do begin{$ENDIF}
for i:= 1 to (Size div 16) do
begin
XorBlock(pointer(longint(@InData)+((i-1)*16)),@LB,@TB,Sizeof(TB));
{$IFDEF CFORM}Encrypt(TB,TB){$ELSE}TwofishEncryptECB(Data,TB,TB){$ENDIF};
Move(TB,pointer(longint(@OutData)+((i-1)*16))^,Sizeof(TB));
Move(TB,LB,Sizeof(TB));
end;
if (Size mod 16)<> 0 then
begin
{$IFDEF CFORM}Encrypt(LB,TB){$ELSE}TwofishEncryptECB(Data,LB,TB){$ENDIF};
XorBlock(@TB,@pointer(longint(@InData)+Size-(Size mod 16))^,@pointer(longint(@OutData)+Size-(Size mod 16))^,Size mod 16);
end;
FillChar(TB,Sizeof(TB),$FF);
{$IFNDEF CFORM}end;{$ENDIF}
end;
{$IFDEF CFORM}
procedure TDCP_twofish.DecryptCBC(const InData; var OutData; Size: longint);
{$ELSE}
procedure TwofishDecryptCBC;
{$ENDIF}
var
TB: array[0..15] of byte;
i: longint;
begin
{$IFDEF CFORM}
if not fInitialized then
raise Exception.Create('Twofish: Not initialized');
{$ELSE}with Data do begin{$ENDIF}
for i:= 1 to (Size div 16) do
begin
Move(pointer(longint(@InData)+((i-1)*16))^,TB,Sizeof(TB));
{$IFDEF CFORM}
Decrypt(pointer(longint(@InData)+((i-1)*16))^,pointer(longint(@OutData)+((i-1)*16))^);
{$ELSE}
TwofishDecryptECB(Data,pointer(longint(@InData)+((i-1)*16))^,pointer(longint(@OutData)+((i-1)*16))^);
{$ENDIF}
XorBlock(@LB,pointer(longint(@OutData)+((i-1)*16)),pointer(longint(@OutData)+((i-1)*16)),Sizeof(TB));
Move(TB,LB,Sizeof(TB));
end;
if (Size mod 16)<> 0 then
begin
{$IFDEF CFORM}Encrypt(LB,TB){$ELSE}TwofishEncryptECB(Data,LB,TB){$ENDIF};
XorBlock(@TB,@pointer(longint(@InData)+Size-(Size mod 16))^,@pointer(longint(@OutData)+Size-(Size mod 16))^,Size mod 16);
end;
FillChar(TB,Sizeof(TB),$FF);
{$IFNDEF CFORM}end;{$ENDIF}
end;
{$IFDEF CFORM}
procedure TDCP_twofish.EncryptCFB(const InData; var OutData; Size: longint);
{$ELSE}
procedure TwofishEncryptCFB;
{$ENDIF}
var
i: longint;
TB: array[0..15] of byte;
begin
{$IFDEF CFORM}
if not fInitialized then
raise Exception.Create('Twofish: Not initialized');
{$ELSE}with Data do begin{$ENDIF}
for i:= 0 to Size-1 do
begin
{$IFDEF CFORM}Encrypt(LB,TB){$ELSE}TwofishEncryptECB(Data,LB,TB){$ENDIF};
PByteArray(@OutData)^[i]:= PByteArray(@InData)^[i] xor TB[0];
Move(LB[1],LB[0],15);
LB[15]:= PByteArray(@OutData)^[i];
end;
{$IFNDEF CFORM}end;{$ENDIF}
end;
{$IFDEF CFORM}
procedure TDCP_twofish.DecryptCFB(const InData; var OutData; Size: longint);
{$ELSE}
procedure TwofishDecryptCFB;
{$ENDIF}
var
i: longint;
TB: array[0..15] of byte;
b: byte;
begin
{$IFDEF CFORM}
if not fInitialized then
raise Exception.Create('Twofish: Not initialized');
{$ELSE}with Data do begin{$ENDIF}
for i:= 0 to Size-1 do
begin
b:= PByteArray(@InData)^[i];
{$IFDEF CFORM}Encrypt(LB,TB){$ELSE}TwofishEncryptECB(Data,LB,TB){$ENDIF};
PByteArray(@OutData)^[i]:= PByteArray(@InData)^[i] xor TB[0];
Move(LB[1],LB[0],15);
LB[15]:= b;
end;
{$IFNDEF CFORM}end;{$ENDIF}
end;
procedure PreCompMDS;
var
m1, mx, my: array[0..1] of DWord;
nI: longint;
begin
for nI:= 0 to 255 do
begin
m1[0]:= p8x8[0,nI];
mx[0]:= Mul_X(m1[0]);
my[0]:= Mul_Y(m1[0]);
m1[1]:= p8x8[1,nI];
mx[1]:= Mul_X(m1[1]);
my[1]:= Mul_Y(m1[1]);
mds[0,nI]:= (m1[P_00] shl 0) or
(mx[p_00] shl 8) or
(my[p_00] shl 16) or
(my[p_00] shl 24);
mds[1,nI]:= (my[p_10] shl 0) or
(my[p_10] shl 8) or
(mx[p_10] shl 16) or
(m1[p_10] shl 24);
mds[2,nI]:= (mx[p_20] shl 0) or
(my[p_20] shl 8) or
(m1[p_20] shl 16) or
(my[p_20] shl 24);
mds[3,nI]:= (mx[p_30] shl 0) or
(m1[p_30] shl 8) or
(my[p_30] shl 16) or
(mx[p_30] shl 24);
end;
end;
initialization
PreCompMDS;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -