⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dcpblockciphers.pas

📁 wbs43open-src.zip 数字隐藏工具
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    XorBlock(p2^,CV,Size mod 8);
  end;
end;

procedure TDCP_blockcipher64.EncryptCTR(const Indata; var Outdata; Size: longword);
var
  temp: array[0..7] of byte;
  i: longword;
  p1, p2: pointer;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to (Size div 8) do
  begin
    EncryptECB(CV,temp);
    IncCounter;
    Move(p1^,p2^,8);
    XorBlock(p2^,temp,8);
    p1:= pointer(longword(p1) + 8);
    p2:= pointer(longword(p2) + 8);
  end;
  if (Size mod 8)<> 0 then
  begin
    EncryptECB(CV,temp);
    IncCounter;
    Move(p1^,p2^,Size mod 8);
    XorBlock(p2^,temp,Size mod 8);
  end;
end;

procedure TDCP_blockcipher64.DecryptCTR(const Indata; var Outdata; Size: longword);
var
  temp: array[0..7] of byte;
  i: longword;
  p1, p2: pointer;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to (Size div 8) do
  begin
    EncryptECB(CV,temp);
    IncCounter;
    Move(p1^,p2^,8);
    XorBlock(p2^,temp,8);
    p1:= pointer(longword(p1) + 8);
    p2:= pointer(longword(p2) + 8);
  end;
  if (Size mod 8)<> 0 then
  begin
    EncryptECB(CV,temp);
    IncCounter;
    Move(p1^,p2^,Size mod 8);
    XorBlock(p2^,temp,Size mod 8);
  end;
end;

{** TDCP_blockcipher128 ********************************************************}

procedure TDCP_blockcipher128.IncCounter;
var
  i: integer;
begin
  Inc(CV[15]);
  i:= 15;
  while (i> 0) and (CV[i] = 0) do
  begin
    Inc(CV[i-1]);
    Dec(i);
  end;
end;

class function TDCP_blockcipher128.GetBlockSize: integer;
begin
  Result:= 128;
end;

procedure TDCP_blockcipher128.Init(const Key; Size: longword; InitVector: pointer);
begin
  inherited Init(Key,Size,InitVector);
  InitKey(Key,Size);
  if InitVector= nil then
  begin
    FillChar(IV,16,{$IFDEF DCP1COMPAT}$FF{$ELSE}0{$ENDIF});
    EncryptECB(IV,IV);
    Reset;
  end
  else
  begin
    Move(InitVector^,IV,16);
    Reset;
  end;
end;

procedure TDCP_blockcipher128.SetIV(const Value);
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  Move(Value,IV,16);
  Reset;
end;

procedure TDCP_blockcipher128.GetIV(var Value);
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  Move(CV,Value,16);
end;

procedure TDCP_blockcipher128.Reset;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized')
  else
    Move(IV,CV,16);
end;

procedure TDCP_blockcipher128.Burn;
begin
  FillChar(IV,16,$FF);
  FillChar(CV,16,$FF);
  inherited Burn;
end;

procedure TDCP_blockcipher128.EncryptCBC(const Indata; var Outdata; Size: longword);
var
  i: longword;
  p1, p2: pointer;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to (Size div 16) do
  begin
    Move(p1^,p2^,16);
    XorBlock(p2^,CV,16);
    EncryptECB(p2^,p2^);
    Move(p2^,CV,16);
    p1:= pointer(longword(p1) + 16);
    p2:= pointer(longword(p2) + 16);
  end;
  if (Size mod 16)<> 0 then
  begin
    EncryptECB(CV,CV);
    Move(p1^,p2^,Size mod 16);
    XorBlock(p2^,CV,Size mod 16);
  end;
end;

procedure TDCP_blockcipher128.DecryptCBC(const Indata; var Outdata; Size: longword);
var
  i: longword;
  p1, p2: pointer;
  Temp: array[0..15] of byte;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to (Size div 16) do
  begin
    Move(p1^,p2^,16);
    Move(p1^,Temp,16);
    DecryptECB(p2^,p2^);
    XorBlock(p2^,CV,16);
    Move(Temp,CV,16);
    p1:= pointer(longword(p1) + 16);
    p2:= pointer(longword(p2) + 16);
  end;
  if (Size mod 16)<> 0 then
  begin
    EncryptECB(CV,CV);
    Move(p1^,p2^,Size mod 16);
    XorBlock(p2^,CV,Size mod 16);
  end;
end;

procedure TDCP_blockcipher128.EncryptCFB8bit(const Indata; var Outdata; Size: longword);
var
  i: longword;
  p1, p2: Pbyte;
  Temp: array[0..15] of byte;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to Size do
  begin
    EncryptECB(CV,Temp);
    p2^:= p1^ xor Temp[0];
    Move(CV[1],CV[0],15);
    CV[15]:= p2^;
    Inc(p1);
    Inc(p2);
  end;
end;

procedure TDCP_blockcipher128.DecryptCFB8bit(const Indata; var Outdata; Size: longword);
var
  i: longword;
  p1, p2: Pbyte;
  TempByte: byte;
  Temp: array[0..15] of byte;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to Size do
  begin
    TempByte:= p1^;
    EncryptECB(CV,Temp);
    p2^:= p1^ xor Temp[0];
    Move(CV[1],CV[0],15);
    CV[15]:= TempByte;
    Inc(p1);
    Inc(p2);
  end;
end;

procedure TDCP_blockcipher128.EncryptCFBblock(const Indata; var Outdata; Size: longword);
var
  i: longword;
  p1, p2: Pbyte;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to (Size div 16) do
  begin
    EncryptECB(CV,CV);
    Move(p1^,p2^,16);
    XorBlock(p2^,CV,16);
    Move(p2^,CV,16);
    p1:= pointer(longword(p1) + 16);
    p2:= pointer(longword(p2) + 16);
  end;
  if (Size mod 16)<> 0 then
  begin
    EncryptECB(CV,CV);
    Move(p1^,p2^,Size mod 16);
    XorBlock(p2^,CV,Size mod 16);
  end;
end;

procedure TDCP_blockcipher128.DecryptCFBblock(const Indata; var Outdata; Size: longword);
var
  i: longword;
  p1, p2: Pbyte;
  Temp: array[0..15] of byte;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to (Size div 16) do
  begin
    Move(p1^,Temp,16);
    EncryptECB(CV,CV);
    Move(p1^,p2^,16);
    XorBlock(p2^,CV,16);
    Move(Temp,CV,16);
    p1:= pointer(longword(p1) + 16);
    p2:= pointer(longword(p2) + 16);
  end;
  if (Size mod 16)<> 0 then
  begin
    EncryptECB(CV,CV);
    Move(p1^,p2^,Size mod 16);
    XorBlock(p2^,CV,Size mod 16);
  end;
end;

procedure TDCP_blockcipher128.EncryptOFB(const Indata; var Outdata; Size: longword);
var
  i: longword;
  p1, p2: pointer;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to (Size div 16) do
  begin
    EncryptECB(CV,CV);
    Move(p1^,p2^,16);
    XorBlock(p2^,CV,16);
    p1:= pointer(longword(p1) + 16);
    p2:= pointer(longword(p2) + 16);
  end;
  if (Size mod 16)<> 0 then
  begin
    EncryptECB(CV,CV);
    Move(p1^,p2^,Size mod 16);
    XorBlock(p2^,CV,Size mod 16);
  end;
end;

procedure TDCP_blockcipher128.DecryptOFB(const Indata; var Outdata; Size: longword);
var
  i: longword;
  p1, p2: pointer;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to (Size div 16) do
  begin
    EncryptECB(CV,CV);
    Move(p1^,p2^,16);
    XorBlock(p2^,CV,16);
    p1:= pointer(longword(p1) + 16);
    p2:= pointer(longword(p2) + 16);
  end;
  if (Size mod 16)<> 0 then
  begin
    EncryptECB(CV,CV);
    Move(p1^,p2^,Size mod 16);
    XorBlock(p2^,CV,Size mod 16);
  end;
end;

procedure TDCP_blockcipher128.EncryptCTR(const Indata; var Outdata; Size: longword);
var
  temp: array[0..15] of byte;
  i: longword;
  p1, p2: pointer;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to (Size div 16) do
  begin
    EncryptECB(CV,temp);
    IncCounter;
    Move(p1^,p2^,16);
    XorBlock(p2^,temp,16);
    p1:= pointer(longword(p1) + 16);
    p2:= pointer(longword(p2) + 16);
  end;
  if (Size mod 16)<> 0 then
  begin
    EncryptECB(CV,temp);
    IncCounter;
    Move(p1^,p2^,Size mod 16);
    XorBlock(p2^,temp,Size mod 16);
  end;
end;

procedure TDCP_blockcipher128.DecryptCTR(const Indata; var Outdata; Size: longword);
var
  temp: array[0..15] of byte;
  i: longword;
  p1, p2: pointer;
begin
  if not fInitialized then
    raise EDCP_blockcipher.Create('Cipher not initialized');
  p1:= @Indata;
  p2:= @Outdata;
  for i:= 1 to (Size div 16) do
  begin
    EncryptECB(CV,temp);
    IncCounter;
    Move(p1^,p2^,16);
    XorBlock(p2^,temp,16);
    p1:= pointer(longword(p1) + 16);
    p2:= pointer(longword(p2) + 16);
  end;
  if (Size mod 16)<> 0 then
  begin
    EncryptECB(CV,temp);
    IncCounter;
    Move(p1^,p2^,Size mod 16);
    XorBlock(p2^,temp,Size mod 16);
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -