Sample code for 30+ languages & platforms
Go

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

Go
    success := false

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

    crypt := chilkat.NewCrypt2()

    crypt.SetCryptAlgorithm("aes")
    crypt.SetCipherMode("cbc")
    crypt.SetKeyLength(256)

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

    fileToEncrypt := "qa_data/hamlet.xml"
    facIn := chilkat.NewFileAccess()
    success = facIn.OpenForRead(fileToEncrypt)
    if success != true {
        fmt.Println("Failed to open file that is to be encrytped.")
        crypt.DisposeCrypt2()
        facIn.DisposeFileAccess()
        return
    }

    outputEncryptedFile := "c:/temp/qa_output/hamlet.enc"
    facOutEnc := chilkat.NewFileAccess()
    success = facOutEnc.OpenForWrite(outputEncryptedFile)
    if success != true {
        fmt.Println("Failed to encrypted output file.")
        crypt.DisposeCrypt2()
        facIn.DisposeFileAccess()
        facOutEnc.DisposeFileAccess()
        return
    }

    // Let's encrypt in 10000 byte chunks.
    chunkSize := 10000
    numChunks := facIn.GetNumBlocks(chunkSize)

    crypt.SetFirstChunk(true)
    crypt.SetLastChunk(false)

    bd := chilkat.NewBinData()

    i := 0
    for i < numChunks {
        i = i + 1
        if i == numChunks {
            crypt.SetLastChunk(true)
        }

        // Read the next chunk from the file.
        // The last chunk will be whatever amount remains in the file..
        bd.Clear()
        facIn.FileReadBd(chunkSize,bd)

        // Encrypt.
        crypt.EncryptBd(bd)

        // Write the encrypted chunk to the output file.
        facOutEnc.FileWriteBd(bd,0,0)

        crypt.SetFirstChunk(false)
    }

    // Make sure both FirstChunk and LastChunk are restored to true after
    // encrypting or decrypting in chunks.  Otherwise subsequent encryptions/decryptions
    // will produce unexpected results.
    crypt.SetFirstChunk(true)
    crypt.SetLastChunk(true)

    facIn.FileClose()
    facOutEnc.FileClose()

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

    // Compare the contents of the decrypted file with the original file:
    bSame := facIn.FileContentsEqual(fileToEncrypt,decryptedFile)
    fmt.Println("bSame = ", bSame)

    crypt.DisposeCrypt2()
    facIn.DisposeFileAccess()
    facOutEnc.DisposeFileAccess()
    bd.DisposeBinData()