Sample code for 30+ languages & platforms
Zig

Decrypt File in Chunks using 256-bit AES

See more Encryption Examples

Shows how to decrypt a file chunk-by-chunk using FirstChunk/LastChunk properties and accumulate the results in memory with a Chilkat BinData object.

Chilkat Zig Downloads

Zig
const std = @import("std");
const chilkat = @import("chilkat");

pub fn main() !void {
    // This example assumes the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    // This example decrypts the file previously encrypted in this example:
    // Encrypt File in Chunks using AES CBC

    const crypt = try chilkat.Crypt2.init();
    defer crypt.deinit();

    crypt.setCryptAlgorithm("aes");
    crypt.setCipherMode("cbc");
    crypt.setKeyLength(256);

    crypt.setEncodedKey("000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F", "hex");
    crypt.setEncodedIV("000102030405060708090A0B0C0D0E0F", "hex");

    const file_to_decrypt = "c:/temp/qa_output/hamlet.enc";
    const fac_in = try chilkat.FileAccess.init();
    defer fac_in.deinit();
    fac_in.openForRead(file_to_decrypt) catch {
        std.debug.print("Failed to open file to be decrytped.\n", .{});
        return;
    };

    // Let's decrypt in 32000 byte chunks.
    const chunk_size = 32000;
    const num_chunks = fac_in.getNumBlocks(chunk_size);

    crypt.setFirstChunk(true);
    crypt.setLastChunk(false);

    const bd = try chilkat.BinData.init();
    defer bd.deinit();
    const bd_decrypted = try chilkat.BinData.init();
    defer bd_decrypted.deinit();

    var i: i32 = 0;
    while (i < num_chunks) {
        i = i + 1;
        if (i == num_chunks) {
            crypt.setLastChunk(true);
        }

        // Read the next chunk from the file.
        // The last chunk will be whatever amount remains in the file..
        bd.clear() catch {};
        fac_in.fileReadBd(chunk_size, bd) catch {};

        // Decrypt this chunk.
        crypt.decryptBd(bd) catch {};
        // Accumulate the decrypted chunks.
        bd_decrypted.appendBd(bd) catch {};

        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);

    fac_in.fileClose();

    // The fully decrypted file is contained in bdDecrypted.
    // You can save to a file if desired, or use the decrypted data in your application directly from bdDecrypted.
    bd_decrypted.writeFile("c:/temp/qa_output/hamlet_decrypted.xml") catch {};
}