Delphi DLL
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
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;