📄 blowfish.pas
字号:
KeyB:= @Key;
Move(SBoxOrg,SBox,Sizeof(SBox));
Move(PBoxOrg,PBox,Sizeof(PBox));
k:= 0;
for i:= 0 to 17 do
begin
A:= dword(KeyB^[(k+3) mod Size]);
A:= A + (dword(KeyB^[(k+2) mod Size]) shl 8);
A:= A + (dword(KeyB^[(k+1) mod Size]) shl 16);
A:= A + (dword(KeyB^[k]) shl 24);
PBox[i]:= PBox[i] xor A;
k:= (k+4) mod Size;
end;
FillChar(Block,Sizeof(Block),0);
for i:= 0 to 8 do
begin
{$IFDEF CFORM}Encrypt(Block,Block){$ELSE}BlowfishEncryptECB(Data,Block,Block){$ENDIF};
PBox[i*2]:= dword(Block[3]) + (dword(Block[2]) shl 8) + (dword(Block[1]) shl 16) + (dword(Block[0]) shl 24);
PBox[i*2+1]:= dword(Block[7]) + (dword(Block[6]) shl 8) + (dword(Block[5]) shl 16) + (dword(Block[4]) shl 24);
end;
for k:= 0 to 3 do
begin
for i:= 0 to 127 do
begin
{$IFDEF CFORM}Encrypt(Block,Block){$ELSE}BlowfishEncryptECB(Data,Block,Block){$ENDIF};
SBox[k,i*2]:= dword(Block[3]) + (dword(Block[2]) shl 8) + (dword(Block[1]) shl 16) + (dword(Block[0]) shl 24);
SBox[k,i*2+1]:= dword(Block[7]) + (dword(Block[6]) shl 8) + (dword(Block[5]) shl 16) + (dword(Block[4]) shl 24);
end;
end;
if IVector= nil then
begin
FillChar(IV,Sizeof(IV),$FF);
{$IFDEF CFORM}Encrypt(IV,IV){$ELSE}BlowfishEncryptECB(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_blowfish.Burn;
{$ELSE}
procedure BlowfishBurn;
{$ENDIF}
begin
{$IFNDEF CFORM}with Data do begin{$ENDIF}
FillChar(SBox,Sizeof(SBox),$FF);
FillChar(PBox,Sizeof(PBox),$FF);
FillChar(IV,Sizeof(IV),$FF);
FillChar(LB,Sizeof(LB),$FF);
{$IFDEF CFORM}
fInitialized:= false;
{$ELSE}end;{$ENDIF}
end;
{$IFDEF CFORM}
procedure TDCP_blowfish.Reset;
{$ELSE}
procedure BlowfishReset;
{$ENDIF}
begin
{$IFNDEF CFORM}with Data do{$ENDIF}
Move(IV,LB,Sizeof(LB));
end;
{$IFDEF CFORM}
procedure TDCP_blowfish.EncryptECB(const InBlock; var OutBlock);
begin
if not fInitialized then
raise Exception.Create('Blowfish: Not initialized');
Encrypt(InBlock,OutBlock);
end;
procedure TDCP_blowfish.DecryptECB(const InBlock; var OutBlock);
begin
if not fInitialized then
raise Exception.Create('Blowfish: Not initialized');
Decrypt(InBlock,OutBlock);
end;
{$ENDIF}
{$IFDEF CFORM}
procedure TDCP_blowfish.EncryptCBC(const InData; var OutData; Size: longint);
{$ELSE}
procedure BlowfishEncryptCBC;
{$ENDIF}
var
TB: array[0..7] of byte;
i: longint;
begin
{$IFDEF CFORM}
if not fInitialized then
raise Exception.Create('Blowfish: Not initialized');
{$ELSE}with Data do begin{$ENDIF}
for i:= 1 to (Size div 8) do
begin
XorBlock(pointer(longint(@InData)+((i-1)*8)),@LB,@TB,Sizeof(TB));
{$IFDEF CFORM}Encrypt(TB,TB){$ELSE}BlowfishEncryptECB(Data,TB,TB){$ENDIF};
Move(TB,pointer(longint(@OutData)+((i-1)*8))^,Sizeof(TB));
Move(TB,LB,Sizeof(TB));
end;
if (Size mod 8)<> 0 then
begin
{$IFDEF CFORM}Encrypt(LB,TB){$ELSE}BlowfishEncryptECB(Data,LB,TB){$ENDIF};
XorBlock(@TB,@pointer(longint(@InData)+Size-(Size mod 8))^,@pointer(longint(@OutData)+Size-(Size mod 8))^,Size mod 8);
end;
FillChar(TB,Sizeof(TB),$FF);
{$IFNDEF CFORM}end;{$ENDIF}
end;
{$IFDEF CFORM}
procedure TDCP_blowfish.DecryptCBC(const InData; var OutData; Size: longint);
{$ELSE}
procedure BlowfishDecryptCBC;
{$ENDIF}
var
TB: array[0..7] of byte;
i: longint;
begin
{$IFDEF CFORM}
if not fInitialized then
raise Exception.Create('Blowfish: Not initialized');
{$ELSE}with Data do begin{$ENDIF}
for i:= 1 to (Size div 8) do
begin
Move(pointer(longint(@InData)+((i-1)*8))^,TB,Sizeof(TB));
{$IFDEF CFORM}
Decrypt(pointer(longint(@InData)+((i-1)*8))^,pointer(longint(@OutData)+((i-1)*8))^);
{$ELSE}
BlowfishDecryptECB(Data,pointer(longint(@InData)+((i-1)*8))^,pointer(longint(@OutData)+((i-1)*8))^);
{$ENDIF}
XorBlock(@LB,pointer(longint(@OutData)+((i-1)*8)),pointer(longint(@OutData)+((i-1)*8)),Sizeof(TB));
Move(TB,LB,Sizeof(TB));
end;
if (Size mod 8)<> 0 then
begin
{$IFDEF CFORM}Encrypt(LB,TB){$ELSE}BlowfishEncryptECB(Data,LB,TB){$ENDIF};
XorBlock(@TB,@pointer(longint(@InData)+Size-(Size mod 8))^,@pointer(longint(@OutData)+Size-(Size mod 8))^,Size mod 8);
end;
FillChar(TB,Sizeof(TB),$FF);
{$IFNDEF CFORM}end;{$ENDIF}
end;
{$IFDEF CFORM}
procedure TDCP_blowfish.EncryptCFB(const InData; var OutData; Size: longint);
{$ELSE}
procedure BlowfishEncryptCFB;
{$ENDIF}
var
i: longint;
TB: array[0..7] of byte;
begin
{$IFDEF CFORM}
if not fInitialized then
raise Exception.Create('Blowfish: Not initialized');
{$ELSE}with Data do begin{$ENDIF}
for i:= 0 to Size-1 do
begin
{$IFDEF CFORM}Encrypt(LB,TB){$ELSE}BlowfishEncryptECB(Data,LB,TB){$ENDIF};
PByteArray(@OutData)^[i]:= PByteArray(@InData)^[i] xor TB[0];
Move(LB[1],LB[0],7);
LB[7]:= PByteArray(@OutData)^[i];
end;
{$IFNDEF CFORM}end;{$ENDIF}
end;
{$IFDEF CFORM}
procedure TDCP_blowfish.DecryptCFB(const InData; var OutData; Size: longint);
{$ELSE}
procedure BlowfishDecryptCFB;
{$ENDIF}
var
i: longint;
TB: array[0..7] of byte;
b: byte;
begin
{$IFDEF CFORM}
if not fInitialized then
raise Exception.Create('Blowfish: 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}BlowfishEncryptECB(Data,LB,TB){$ENDIF};
PByteArray(@OutData)^[i]:= PByteArray(@InData)^[i] xor TB[0];
Move(LB[1],LB[0],7);
LB[7]:= b;
end;
{$IFNDEF CFORM}end;{$ENDIF}
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -