Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Streaming Encryption by Encrypting in Chunks

See more Encryption Examples

Encrypt data in chunks.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Crypt2,
  Chilkat.StringBuilder;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  crypt: TCrypt2;
  txt1: string;
  txt2: string;
  txt3: string;
  sbEncrypted: TStringBuilder;
  i: Integer;
  decryptedText: string;

begin
  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  crypt := TCrypt2.Create;

  crypt.CryptAlgorithm := 'aes';
  crypt.CipherMode := 'cbc';
  crypt.KeyLength := 128;

  crypt.SetEncodedKey('000102030405060708090A0B0C0D0E0F','hex');
  crypt.SetEncodedIV('000102030405060708090A0B0C0D0E0F','hex');

  crypt.EncodingMode := 'hex';
  txt1 := 'The quick brown fox jumped over the lazy dog.' + #13#10;
  txt2 := '-' + #13#10;
  txt3 := 'Done.' + #13#10;

  sbEncrypted := TStringBuilder.Create;

  //  Encrypt the 1st chunk:
  //  (don't worry about feeding the data to the encryptor in 
  //  exact multiples of the encryption algorithm's block size.
  //  Chilkat will buffer the data.)
  crypt.FirstChunk := True;
  crypt.LastChunk := False;
  sbEncrypted.Append(crypt.EncryptStringENC(txt1));

  //  Encrypt the 2nd chunk
  crypt.FirstChunk := False;
  crypt.LastChunk := False;
  sbEncrypted.Append(crypt.EncryptStringENC(txt2));

  //  Now encrypt N more chunks...
  //  Remember -- we're doing this in CBC mode, so each call
  //  to the encrypt method depends on the state from previous
  //  calls...
  crypt.FirstChunk := False;
  crypt.LastChunk := False;

  for i := 0 to 4 do
    begin
      sbEncrypted.Append(crypt.EncryptStringENC(txt1));
      sbEncrypted.Append(crypt.EncryptStringENC(txt2));
    end;

  //  Now encrypt the last chunk:
  crypt.FirstChunk := False;
  crypt.LastChunk := True;
  sbEncrypted.Append(crypt.EncryptStringENC(txt3));

  WriteLn(sbEncrypted.GetAsString());

  //  Now decrypt in one call.
  //  (The data we're decrypting is both the first AND last chunk.)  
  crypt.FirstChunk := True;
  crypt.LastChunk := True;
  decryptedText := crypt.DecryptStringENC(sbEncrypted.GetAsString());

  WriteLn(decryptedText);

  //  Note: You may decrypt in N chunks by setting the FirstChunk
  //  and LastChunk properties prior to calling the Decrypt* methods.


  crypt.Free;
  sbEncrypted.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.