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