АгеевМА_КМЗИ
.pdfl:= l xor (((cast_sbox1[t shr 24] + cast_sbox2[(t shr 16) and $FF]) xor cast_sbox3[(t shr 8) and $FF]) - cast_sbox4[t and $FF]);
t:= LRot32(Data.xKey[1] xor l, Data.xKey[1+16]);
r:= r xor (((cast_sbox1[t shr 24] - cast_sbox2[(t shr 16) and $FF]) + cast_sbox3[(t shr 8) and $FF]) xor cast_sbox4[t and $FF]);
t:= LRot32(Data.xKey[0]+r, Data.xKey[0+16]);
l:= l xor (((cast_sbox1[t shr 24] xor cast_sbox2[(t shr 16) and $FF]) - cast_sbox3[(t shr 8) and $FF]) + cast_sbox4[t and $FF]);
l:= (l shr 24) or ((l shr 8) and $FF00) or ((l shl 8) and $FF0000) or (l shl 24); r:= (r shr 24) or ((r shr 8) and $FF00) or ((r shl 8) and $FF0000) or (r shl 24); Move(l,OutData^,Sizeof(l));
Move(r,pointer(integer(OutData)+4)^,Sizeof(r));
end;
procedure Cast128EncryptCBC; begin
XorBlock(InData,@Data.LastBlock,OutData,8);
Cast128EncryptECB(Data,OutData,OutData);
Move(OutData^,Data.LastBlock,8);
end;
procedure Cast128DecryptCBC; var
TempBlock: array[0..7] of byte; begin
Move(InData^,TempBlock,8);
Cast128DecryptECB(Data,InData,OutData);
XorBlock(OutData,@Data.LastBlock,OutData,8);
Move(TempBlock,Data.LastBlock,8);
end;
procedure Cast128EncryptCFB; var
i: integer;
TempBlock: array[0..7] of byte; begin
for i:= 0 to Len-1 do begin
Cast128EncryptECB(Data,@Data.LastBlock,@TempBlock); PByteArray(OutData)[i]:= PByteArray(InData)[i] xor TempBlock[0]; Move(Data.LastBlock[1],Data.LastBlock[0],7);
Data.LastBlock[7]:= PByteArray(OutData)[i]; end;
end;
procedure Cast128DecryptCFB; var
i: integer;
TempBlock: array[0..7] of byte; b: byte;
begin
for i:= 0 to Len-1 do begin
b:= PByteArray(InData)[i]; Cast128EncryptECB(Data,@Data.LastBlock,@TempBlock); PByteArray(OutData)[i]:= PByteArray(InData)[i] xor TempBlock[0]; Move(Data.LastBlock[1],Data.LastBlock[0],7);
Data.LastBlock[7]:= b; end;
end;
procedure Cast128EncryptOFB; begin
Cast128EncryptECB(Data,@Data.LastBlock,@Data.LastBlock);
XorBlock(@Data.LastBlock,InData,OutData,8);
end;
procedure Cast128DecryptOFB; begin
Cast128EncryptECB(Data,@Data.LastBlock,@Data.LastBlock);
XorBlock(@Data.LastBlock,InData,OutData,8);
end;
procedure Cast128EncryptOFBC; var
i: integer;
TempBlock: array[0..7] of byte; begin
for i:= 0 to Len-1 do begin
Cast128EncryptECB(Data,@Data.LastBlock,@TempBlock); PByteArray(OutData)[i]:= PByteArray(InData)[i] xor TempBlock[0]; IncBlock(@Data.LastBlock,8);
end;
end;
procedure Cast128DecryptOFBC; var
i: integer;
TempBlock: array[0..7] of byte;
begin
for i:= 0 to Len-1 do begin
Cast128EncryptECB(Data,@Data.LastBlock,@TempBlock); PByteArray(OutData)[i]:= PByteArray(InData)[i] xor TempBlock[0]; IncBlock(@Data.LastBlock,8);
end;
end;
procedure Cast128Reset; begin
Move(Data.InitBlock,Data.LastBlock,8);
end;
end.
Приложение 3 – Библиотека Tools
unit Tools;
interface uses
Sysutils;
type
{$IFDEF VER120} dword= longword;
{$ELSE} dword= longint;
{$ENDIF}
function LRot16(X: word; c: integer): word; assembler; function RRot16(X: word; c: integer): word; assembler; function LRot32(X: dword; c: integer): dword; assembler; function RRot32(X: dword; c: integer): dword; assembler; procedure XorBlock(I1, I2, O1: PByteArray; Len: integer); procedure IncBlock(P: PByteArray; Len: integer);
implementation
function LRot16(X: word; c: integer): word; assembler; asm
mov ecx,&c mov ax,&X rol ax,cl
mov &Result,ax
end;
function RRot16(X: word; c: integer): word; assembler; asm
mov ecx,&c mov ax,&X ror ax,cl
mov &Result,ax end;
function LRot32(X: dword; c: integer): dword; register; assembler; asm
mov ecx, edx rol eax, cl
end;
function RRot32(X: dword; c: integer): dword; register; assembler; asm
mov ecx, edx ror eax, cl
end;
procedure XorBlock(I1, I2, O1: PByteArray; Len: integer); var
i: integer; begin
for i:= 0 to Len-1 do O1[i]:= I1[i] xor I2[i];
end;
procedure IncBlock(P: PByteArray; Len: integer); begin
Inc(P[Len-1]);
if (P[Len-1]= 0) and (Len> 1) then IncBlock(P,Len-1);
end;
end.
