Sample code for 30+ languages & platforms
Lianja

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 Lianja Downloads

Lianja
llSuccess = .F.

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

loCrypt = createobject("CkCrypt2")

loCrypt.CryptAlgorithm = "aes"
loCrypt.CipherMode = "cbc"
loCrypt.KeyLength = 256

loCrypt.SetEncodedKey("000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F","hex")
loCrypt.SetEncodedIV("000102030405060708090A0B0C0D0E0F","hex")

lcFileToEncrypt = "qa_data/hamlet.xml"
loFacIn = createobject("CkFileAccess")
llSuccess = loFacIn.OpenForRead(lcFileToEncrypt)
if (llSuccess <> .T.) then
    ? "Failed to open file that is to be encrytped."
    release loCrypt
    release loFacIn
    return
endif

lcOutputEncryptedFile = "c:/temp/qa_output/hamlet.enc"
loFacOutEnc = createobject("CkFileAccess")
llSuccess = loFacOutEnc.OpenForWrite(lcOutputEncryptedFile)
if (llSuccess <> .T.) then
    ? "Failed to encrypted output file."
    release loCrypt
    release loFacIn
    release loFacOutEnc
    return
endif

// Let's encrypt in 10000 byte chunks.
lnChunkSize = 10000
lnNumChunks = loFacIn.GetNumBlocks(lnChunkSize)

loCrypt.FirstChunk = .T.
loCrypt.LastChunk = .F.

loBd = createobject("CkBinData")

i = 0
do while i < lnNumChunks
    i = i + 1
    if (i = lnNumChunks) then
        loCrypt.LastChunk = .T.
    endif

    // Read the next chunk from the file.
    // The last chunk will be whatever amount remains in the file..
    loBd.Clear()
    loFacIn.FileReadBd(lnChunkSize,loBd)

    // Encrypt.
    loCrypt.EncryptBd(loBd)

    // Write the encrypted chunk to the output file.
    loFacOutEnc.FileWriteBd(loBd,0,0)

    loCrypt.FirstChunk = .F.
enddo

// Make sure both FirstChunk and LastChunk are restored to .T. after
// encrypting or decrypting in chunks.  Otherwise subsequent encryptions/decryptions
// will produce unexpected results.
loCrypt.FirstChunk = .T.
loCrypt.LastChunk = .T.

loFacIn.FileClose()
loFacOutEnc.FileClose()

// Decrypt the encrypted output file in a single call using CBC mode:
lcDecryptedFile = "qa_output/hamlet_dec.xml"
llSuccess = loCrypt.CkDecryptFile(lcOutputEncryptedFile,lcDecryptedFile)
// Assume success for the example..

// Compare the contents of the decrypted file with the original file:
llBSame = loFacIn.FileContentsEqual(lcFileToEncrypt,lcDecryptedFile)
? "bSame = " + str(llBSame)


release loCrypt
release loFacIn
release loFacOutEnc
release loBd