Sample code for 30+ languages & platforms
Delphi DLL

Encrypt File in Chunks using AES CBC

See more Encryption Examples

Demonstrates how to use the FirstChunk/LastChunk properties to encrypt a file chunk-by-chunk.

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, FileAccess, BinData, Crypt2;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
crypt: HCkCrypt2;
fileToEncrypt: PWideChar;
facIn: HCkFileAccess;
outputEncryptedFile: PWideChar;
facOutEnc: HCkFileAccess;
chunkSize: Integer;
numChunks: Integer;
bd: HCkBinData;
i: Integer;
decryptedFile: PWideChar;
bSame: Boolean;

begin
success := False;

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

crypt := CkCrypt2_Create();

CkCrypt2_putCryptAlgorithm(crypt,'aes');
CkCrypt2_putCipherMode(crypt,'cbc');
CkCrypt2_putKeyLength(crypt,256);

CkCrypt2_SetEncodedKey(crypt,'000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F','hex');
CkCrypt2_SetEncodedIV(crypt,'000102030405060708090A0B0C0D0E0F','hex');

fileToEncrypt := 'qa_data/hamlet.xml';
facIn := CkFileAccess_Create();
success := CkFileAccess_OpenForRead(facIn,fileToEncrypt);
if (success <> True) then
  begin
    Memo1.Lines.Add('Failed to open file that is to be encrytped.');
    Exit;
  end;

outputEncryptedFile := 'c:/temp/qa_output/hamlet.enc';
facOutEnc := CkFileAccess_Create();
success := CkFileAccess_OpenForWrite(facOutEnc,outputEncryptedFile);
if (success <> True) then
  begin
    Memo1.Lines.Add('Failed to encrypted output file.');
    Exit;
  end;

// Let's encrypt in 10000 byte chunks.
chunkSize := 10000;
numChunks := CkFileAccess_GetNumBlocks(facIn,chunkSize);

CkCrypt2_putFirstChunk(crypt,True);
CkCrypt2_putLastChunk(crypt,False);

bd := CkBinData_Create();

i := 0;
while i < numChunks do
  begin
    i := i + 1;
    if (i = numChunks) then
      begin
        CkCrypt2_putLastChunk(crypt,True);
      end;

    // Read the next chunk from the file.
    // The last chunk will be whatever amount remains in the file..
    CkBinData_Clear(bd);
    CkFileAccess_FileReadBd(facIn,chunkSize,bd);

    // Encrypt.
    CkCrypt2_EncryptBd(crypt,bd);

    // Write the encrypted chunk to the output file.
    CkFileAccess_FileWriteBd(facOutEnc,bd,0,0);

    CkCrypt2_putFirstChunk(crypt,False);
  end;

// Make sure both FirstChunk and LastChunk are restored to True after
// encrypting or decrypting in chunks.  Otherwise subsequent encryptions/decryptions
// will produce unexpected results.
CkCrypt2_putFirstChunk(crypt,True);
CkCrypt2_putLastChunk(crypt,True);

CkFileAccess_FileClose(facIn);
CkFileAccess_FileClose(facOutEnc);

// Decrypt the encrypted output file in a single call using CBC mode:
decryptedFile := 'qa_output/hamlet_dec.xml';
success := CkCrypt2_CkDecryptFile(crypt,outputEncryptedFile,decryptedFile);
// Assume success for the example..

// Compare the contents of the decrypted file with the original file:
bSame := CkFileAccess_FileContentsEqual(facIn,fileToEncrypt,decryptedFile);
Memo1.Lines.Add('bSame = ' + IntToStr(Ord(bSame)));

CkCrypt2_Dispose(crypt);
CkFileAccess_Dispose(facIn);
CkFileAccess_Dispose(facOutEnc);
CkBinData_Dispose(bd);

end;