Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

АгеевМА_КМЗИ

.pdf
Скачиваний:
42
Добавлен:
02.05.2015
Размер:
499.79 Кб
Скачать

l:= 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.