Sample code for 30+ languages & platforms
PureBasic

Compress and Encrypt a Large File (Low and Constant Memory Footprint)

See more Compression Examples

Demonstrates how to compress and encrypt a large file such that the memory footprint remains low and constant.

Note: This example requires Chilkat v9.5.0.99 or greater.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkCompression.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkCrypt2.pb"

Procedure ChilkatExample()

    success.i = 0

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

    compress.i = CkCompression::ckCreate()
    If compress.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkCompression::setCkAlgorithm(compress, "deflate")

    ; Set encryption params.
    ; The possible values are the same as for the corresponding properties in the Chilkat Crypt2 class/object.
    ; The encoded IV and Key must be specified as hex.
    json.i = CkJsonObject::ckCreate()
    If json.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckUpdateString(json,"cryptAlgorithm","aes")
    CkJsonObject::ckUpdateString(json,"cipherMode","cbc")
    CkJsonObject::ckUpdateInt(json,"keyLength",128)
    CkJsonObject::ckUpdateInt(json,"paddingScheme",0)
    CkJsonObject::ckUpdateString(json,"encodedIV","000102030405060708090A0B0C0D0E0F")
    CkJsonObject::ckUpdateString(json,"encodedKey","000102030405060708090A0B0C0D0E0F")

    ; Do file-to-file compression+encryption in a single call.
    inPath.s = "qa_data/largeFile.dat"
    outPath.s = "c:/temp/qa_output/compressed_encrypted.dat"
    success = CkCompression::ckCompressEncryptFile(compress,json,inPath,outPath)
    If success = 0
        Debug CkCompression::ckLastErrorText(compress)
        CkCompression::ckDispose(compress)
        CkJsonObject::ckDispose(json)
        ProcedureReturn
    EndIf

    ; We can do file-to-file decrypt/decompress like this:
    inPath2.s = outPath
    outPath2.s = "c:/temp/qa_output/restored.dat"
    success = CkCompression::ckDecryptDecompressFile(compress,json,inPath2,outPath2)
    If success = 0
        Debug CkCompression::ckLastErrorText(compress)
        CkCompression::ckDispose(compress)
        CkJsonObject::ckDispose(json)
        ProcedureReturn
    EndIf

    ; Note: The above decrypt + decompress is the equivalent of doing the same in these two steps:
    crypt.i = CkCrypt2::ckCreate()
    If crypt.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkCrypt2::setCkCryptAlgorithm(crypt, "aes")
    CkCrypt2::setCkCipherMode(crypt, "cbc")
    CkCrypt2::setCkKeyLength(crypt, 128)
    CkCrypt2::setCkPaddingScheme(crypt, 0)
    CkCrypt2::ckSetEncodedIV(crypt,"000102030405060708090A0B0C0D0E0F","hex")
    CkCrypt2::ckSetEncodedKey(crypt,"000102030405060708090A0B0C0D0E0F","hex")

    decryptedPath.s = "c:/temp/qa_output/decrypted.dat"
    success = CkCrypt2::ckCkDecryptFile(crypt,inPath2,decryptedPath)
    If success = 0
        Debug CkCrypt2::ckLastErrorText(crypt)
        CkCompression::ckDispose(compress)
        CkJsonObject::ckDispose(json)
        CkCrypt2::ckDispose(crypt)
        ProcedureReturn
    EndIf

    outPath3.s = "c:/temp/qa_output/restored_in_two_steps.dat"
    success = CkCompression::ckDecompressFile(compress,decryptedPath,outPath3)
    If success = 0
        Debug CkCompression::ckLastErrorText(compress)
        CkCompression::ckDispose(compress)
        CkJsonObject::ckDispose(json)
        CkCrypt2::ckDispose(crypt)
        ProcedureReturn
    EndIf

    Debug "Success."


    CkCompression::ckDispose(compress)
    CkJsonObject::ckDispose(json)
    CkCrypt2::ckDispose(crypt)


    ProcedureReturn
EndProcedure