Zig
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
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
}