Sample code for 30+ languages & platforms
Zig

Decrypt 256-bit AES GCM Produced by Something Unknown

See more Encryption Examples

Demonstrates how to decrypt something produced elsewhere (unknown) with 256-bit AES GCM.

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 assumes the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    // We have the following to decrypt:

    // Key (Base64):
    const key_base64 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    // IV (Base64Url):
    const iv_base64_url = "xrvaINMLqotAbWRK";

    // ciphertext (base64url):
    const cipher_base64_url = "RtGNAS-zQOxSB8W0HfqJjCoyt9KgImW_l-HjVC40hOOl-RNfRF3hzDIT1kvFVF8i_KX9XmqAftb6lyq-jLCEc_MSgqt3q1ixv3Ez4SbS3G5e3qGzLwxIMi2sCt00aDNwK2ipsJ4aw8s7ePPnl4oY-y1st9rwCWR0rrgEZwS9jmS4uJWGPn9K3jbKRnMslznDbtFLNJctMVXBTP-cv47JelxLCBOQSlK29rMuEFrhHR_VQrPq6gtZaBVSXZSYT0XOklp7nu9mVhrMCRtBCC5oiu5MPE5JYx4ANo3hUY7_NyQl2bpn9GfRXrdvqRGE-gy2upj-cDkm0t_tV8xmYge9DBQTH3B_4BGl2qTk_o-m7pEmKkS8XSdQhGcuFlykqrkE8SzB5I8esfzWOM0pwxbz0H_VaylKYHY=";

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

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

    try crypt.setEncodedAad("random", "ascii");
    crypt.setEncodedKey(key_base64, "base64");
    crypt.setEncodedIV(iv_base64_url, "base64url");

    // The cipher text contains the 16-byte auth tag at the end.
    // get it separately..
    const bd_encrypted = try chilkat.BinData.init();
    defer bd_encrypted.deinit();
    const bd_auth_tag = try chilkat.BinData.init();
    defer bd_auth_tag.deinit();
    try bd_encrypted.appendEncoded(cipher_base64_url, "base64url");

    const num_bytes = bd_encrypted.getNumBytes();
    const auth_tag_hex = try bd_encrypted.getEncodedChunk(alloc, num_bytes - 16, 16, "hex");

    std.debug.print("Auth tag in hex: {s}\n", .{auth_tag_hex});

    try bd_auth_tag.appendEncoded(auth_tag_hex, "hex");
    bd_encrypted.removeChunk(num_bytes - 16, 16) catch {};

    // Use this special value to tell Chilkat to ignore the auth tag.
    try crypt.setEncodedAuthTag("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "hex");

    // Decrypt
    crypt.setEncodingMode("base64");
    const original_text = crypt.decryptStringENC(alloc, try bd_encrypted.getEncoded(alloc, "base64")) catch "";
    if (!crypt.getLastMethodSuccess()) {
        std.debug.print("{s}\n", .{try crypt.getLastErrorText(alloc)});
    } else {
        std.debug.print("{s}\n", .{original_text});
        std.debug.print("Success.\n", .{});
    }

    // Decrypted text
}