Sample code for 30+ languages & platforms
Zig

Streaming Encryption by Encrypting in Chunks

See more Encryption Examples

Encrypt data in chunks.

Chilkat Zig Downloads

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

pub fn main(init: std.process.Init) !void {
    const alloc = init.arena.allocator();

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

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

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

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

    crypt.setEncodingMode("hex");
    const txt1 = "The quick brown fox jumped over the lazy dog.\r\n";
    const txt2 = "-\r\n";
    const txt3 = "Done.\r\n";

    const sb_encrypted = try chilkat.StringBuilder.init();
    defer sb_encrypted.deinit();

    // Encrypt the 1st chunk:
    // (don't worry about feeding the data to the encryptor in
    // exact multiples of the encryption algorithm's block size.
    // Chilkat will buffer the data.)
    crypt.setFirstChunk(true);
    crypt.setLastChunk(false);
    sb_encrypted.append(try crypt.encryptStringENC(alloc, txt1)) catch {};

    // Encrypt the 2nd chunk
    crypt.setFirstChunk(false);
    crypt.setLastChunk(false);
    sb_encrypted.append(try crypt.encryptStringENC(alloc, txt2)) catch {};

    // Now encrypt N more chunks...
    // Remember -- we're doing this in CBC mode, so each call
    // to the encrypt method depends on the state from previous
    // calls...
    crypt.setFirstChunk(false);
    crypt.setLastChunk(false);
    var i: i32 = 0;
    i = 0;
    while (i <= 4) : (i += 1) {
        sb_encrypted.append(try crypt.encryptStringENC(alloc, txt1)) catch {};
        sb_encrypted.append(try crypt.encryptStringENC(alloc, txt2)) catch {};
    }

    // Now encrypt the last chunk:
    crypt.setFirstChunk(false);
    crypt.setLastChunk(true);
    sb_encrypted.append(try crypt.encryptStringENC(alloc, txt3)) catch {};

    std.debug.print("{s}\n", .{try sb_encrypted.getAsString(alloc)});

    // Now decrypt in one call.
    // (The data we're decrypting is both the first AND last chunk.)
    crypt.setFirstChunk(true);
    crypt.setLastChunk(true);
    const decrypted_text = try crypt.decryptStringENC(alloc, try sb_encrypted.getAsString(alloc));

    std.debug.print("{s}\n", .{decrypted_text});

    // Note: You may decrypt in N chunks by setting the FirstChunk
    // and LastChunk properties prior to calling the Decrypt* methods.
}