📄 blowfish.pas
字号:
{******************************************************************************}
{** A binary compatible implementation of Blowfish ****************************}
{******************************************************************************}
{** Written by David Barton (davebarton@bigfoot.com) **************************}
{** http://www.scramdisk.clara.net/ *******************************************}
{******************************************************************************}
unit Blowfish;
interface
{$I DCPcrypt.inc}
uses
{$IFDEF CFORM}Classes, Sysutils, {$ENDIF}DCPcrypt;
{$IFDEF CFORM}
type
TDCP_blowfish= class(TDCP_blockcipher)
protected
IV, LB: array[0..7] of byte;
SBox: array[0..3,0..255] of DWord;
PBox: array[0..17] of DWord;
procedure Encrypt(const InBlock; var OutBlock);
procedure Decrypt(const InBlock; var OutBlock);
public
procedure Init(var Key; Size: longint; IVector: pointer); override;
procedure Burn; override;
procedure Reset; override;
procedure EncryptECB(const InBlock; var OutBlock); override;
procedure DecryptECB(const InBlock; var OutBlock); override;
procedure EncryptCBC(const InData; var OutData; Size: longint); override;
procedure DecryptCBC(const InData; var OutData; Size: longint); override;
procedure EncryptCFB(const InData; var OutData; Size: longint); override;
procedure DecryptCFB(const InData; var OutData; Size: longint); override;
constructor Create(AOwner: TComponent); override;
end;
{$ELSE}
type
TBlowfishData= record
IV, LB: array[0..7] of byte;
SBox: array[0..3,0..255] of DWord;
PBox: array[0..17] of DWord;
end;
procedure BlowfishInit(var Data: TBlowfishData; var Key; Size: longint; IVector: pointer);
procedure BlowfishReset(var Data: TBlowfishData);
procedure BlowfishBurn(var Data: TBlowfishData);
procedure BlowfishEncryptECB(var Data: TBlowfishData; const InBlock; var OutBlock);
procedure BlowfishDecryptECB(var Data: TBlowfishData; const InBlock; var OutBlock);
procedure BlowfishEncryptCBC(var Data: TBlowfishData; const InData; var OutData; Size: longint);
procedure BlowfishDecryptCBC(var Data: TBlowfishData; const InData; var OutData; Size: longint);
procedure BlowfishEncryptCFB(var Data: TBlowfishData; const InData; var OutData; Size: longint);
procedure BlowfishDecryptCFB(var Data: TBlowfishData; const InData; var OutData; Size: longint);
{$ENDIF}
{******************************************************************************}
{******************************************************************************}
implementation
{$I Blowfish.Inc}
{$IFDEF CFORM}
constructor TDCP_blowfish.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fAlgorithm:= 'Blowfish';
fBlockSize:= 64;
fMaxKeySize:= 448;
fID:= 5;
Burn;
end;
{$ENDIF}
{$IFDEF CFORM}
procedure TDCP_blowfish.Encrypt(const InBlock; var OutBlock);
{$ELSE}
procedure BlowfishEncryptECB;
{$ENDIF}
var
xL, xR: DWord;
begin
{$IFNDEF CFORM}with Data do begin{$ENDIF}
Move(InBlock,xL,4);
Move(pointer(longint(@InBlock)+4)^,xR,4);
xL:= (xL shr 24) or ((xL shr 8) and $FF00) or ((xL shl 8) and $FF0000) or (xL shl 24);
xR:= (xR shr 24) or ((xR shr 8) and $FF00) or ((xR shl 8) and $FF0000) or (xR shl 24);
xL:= xL xor PBox[0];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[1];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[2];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[3];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[4];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[5];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[6];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[7];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[8];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[9];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[10];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[11];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[12];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[13];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[14];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[15];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[16];
xR:= xR xor PBox[17];
xL:= (xL shr 24) or ((xL shr 8) and $FF00) or ((xL shl 8) and $FF0000) or (xL shl 24);
xR:= (xR shr 24) or ((xR shr 8) and $FF00) or ((xR shl 8) and $FF0000) or (xR shl 24);
Move(xR,OutBlock,4);
Move(xL,pointer(longint(@OutBlock)+4)^,4);
{$IFNDEF CFORM}end;{$ENDIF}
end;
{$IFDEF CFORM}
procedure TDCP_blowfish.Decrypt(const InBlock; var OutBlock);
{$ELSE}
procedure BlowfishDecryptECB;
{$ENDIF}
var
xL, xR: DWord;
begin
{$IFNDEF CFORM}with Data do begin{$ENDIF}
Move(InBlock,xL,4);
Move(pointer(longint(@InBlock)+4)^,xR,4);
xL:= (xL shr 24) or ((xL shr 8) and $FF00) or ((xL shl 8) and $FF0000) or (xL shl 24);
xR:= (xR shr 24) or ((xR shr 8) and $FF00) or ((xR shl 8) and $FF0000) or (xR shl 24);
xL:= xL xor PBox[17];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[16];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[15];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[14];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[13];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[12];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[11];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[10];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[9];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[8];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[7];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[6];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[5];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[4];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[3];
xR:= xR xor (((SBox[0,(xL shr 24) and $FF] + SBox[1,(xL shr 16) and $FF]) xor
SBox[2,(xL shr 8) and $FF]) + SBox[3,xL and $FF]) xor PBox[2];
xL:= xL xor (((SBox[0,(xR shr 24) and $FF] + SBox[1,(xR shr 16) and $FF]) xor
SBox[2,(xR shr 8) and $FF]) + SBox[3,xR and $FF]) xor PBox[1];
xR:= xR xor PBox[0];
xL:= (xL shr 24) or ((xL shr 8) and $FF00) or ((xL shl 8) and $FF0000) or (xL shl 24);
xR:= (xR shr 24) or ((xR shr 8) and $FF00) or ((xR shl 8) and $FF0000) or (xR shl 24);
Move(xR,OutBlock,4);
Move(xL,pointer(longint(@OutBlock)+4)^,4);
{$IFNDEF CFORM}end;{$ENDIF}
end;
{$IFDEF CFORM}
procedure TDCP_blowfish.Init(var Key; Size: longint; IVector: pointer);
{$ELSE}
procedure BlowfishInit;
{$ENDIF}
var
i, k: longint;
A: DWord;
KeyB: PByteArray;
Block: array[0..7] of byte;
begin
{$IFDEF CFORM}
if fInitialized then
Burn;
if (Size> fMaxKeySize) or (Size<= 0) or ((Size mod 8)<> 0) then
raise Exception.Create(Format('Blowfish: Invalid key size - %d',[Size]));
{$ELSE}
if (Size> 448) or (Size<= 0) or ((Size mod 8)<> 0) then
Exit;
with Data do begin
{$ENDIF}
Size:= Size div 8;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -