Sample code for 30+ languages & platforms
Tcl

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

Tcl

load ./chilkat.dll

set success 0

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

set crypt [new_CkCrypt2]

CkCrypt2_put_CryptAlgorithm $crypt "aes"
CkCrypt2_put_CipherMode $crypt "cbc"
CkCrypt2_put_KeyLength $crypt 256

CkCrypt2_SetEncodedKey $crypt "000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F" "hex"
CkCrypt2_SetEncodedIV $crypt "000102030405060708090A0B0C0D0E0F" "hex"

set fileToEncrypt "qa_data/hamlet.xml"
set facIn [new_CkFileAccess]

set success [CkFileAccess_OpenForRead $facIn $fileToEncrypt]
if {$success != 1} then {
    puts "Failed to open file that is to be encrytped."
    delete_CkCrypt2 $crypt
    delete_CkFileAccess $facIn
    exit
}

set outputEncryptedFile "c:/temp/qa_output/hamlet.enc"
set facOutEnc [new_CkFileAccess]

set success [CkFileAccess_OpenForWrite $facOutEnc $outputEncryptedFile]
if {$success != 1} then {
    puts "Failed to encrypted output file."
    delete_CkCrypt2 $crypt
    delete_CkFileAccess $facIn
    delete_CkFileAccess $facOutEnc
    exit
}

# Let's encrypt in 10000 byte chunks.
set chunkSize 10000
set numChunks [CkFileAccess_GetNumBlocks $facIn $chunkSize]

CkCrypt2_put_FirstChunk $crypt 1
CkCrypt2_put_LastChunk $crypt 0

set bd [new_CkBinData]

set i 0
while {$i < $numChunks} {
    set i [expr $i + 1]
    if {$i == $numChunks} then {
        CkCrypt2_put_LastChunk $crypt 1
    }

    # 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_put_FirstChunk $crypt 0
}

# Make sure both FirstChunk and LastChunk are restored to 1 after
# encrypting or decrypting in chunks.  Otherwise subsequent encryptions/decryptions
# will produce unexpected results.
CkCrypt2_put_FirstChunk $crypt 1
CkCrypt2_put_LastChunk $crypt 1

CkFileAccess_FileClose $facIn
CkFileAccess_FileClose $facOutEnc

# Decrypt the encrypted output file in a single call using CBC mode:
set decryptedFile "qa_output/hamlet_dec.xml"
set success [CkCrypt2_CkDecryptFile $crypt $outputEncryptedFile $decryptedFile]
# Assume success for the example..

# Compare the contents of the decrypted file with the original file:
set bSame [CkFileAccess_FileContentsEqual $facIn $fileToEncrypt $decryptedFile]
puts "bSame = $bSame"

delete_CkCrypt2 $crypt
delete_CkFileAccess $facIn
delete_CkFileAccess $facOutEnc
delete_CkBinData $bd