std.crypto em Zig — Referência e Exemplos

std.crypto — Criptografia

O módulo std.crypto fornece implementações criptográficas de alta qualidade escritas em Zig puro (sem dependências de C). Ele inclui funções de hash, cifras simétricas e assimétricas, autenticação de mensagens (MAC), geração de números aleatórios criptograficamente seguros e funções de derivação de chaves. Todas as implementações visam resistência a ataques de canal lateral (side-channel attacks).

Visão Geral

const std = @import("std");
const crypto = std.crypto;

Organização do Módulo

std.crypto
├── hash          — Funções de hash (SHA-2, SHA-3, Blake)
├── auth          — Autenticação de mensagens (HMAC, Poly1305)
├── aead          — Cifras autenticadas (AES-GCM, ChaCha20-Poly1305)
├── sign          — Assinaturas digitais (Ed25519)
├── dh            — Troca de chaves (X25519)
├── kdf           — Derivação de chaves (HKDF)
├── pwhash        — Hashing de senhas (Argon2, bcrypt)
├── random        — Geração aleatória segura
└── certificate   — Certificados X.509

Funções de Hash

// SHA-2
crypto.hash.sha2.Sha256    // SHA-256
crypto.hash.sha2.Sha512    // SHA-512

// SHA-3
crypto.hash.sha3.Sha3_256  // SHA3-256

// BLAKE
crypto.hash.Blake2b256     // BLAKE2b-256
crypto.hash.Blake3         // BLAKE3

Cifras

// AES-GCM
crypto.aead.aes_gcm.Aes256Gcm

// ChaCha20-Poly1305
crypto.aead.chacha_poly.ChaCha20Poly1305

Exemplo 1: Hash de Dados e Arquivos

const std = @import("std");
const crypto = std.crypto;

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();

    // SHA-256 de uma string
    const dados = "Zig é seguro por design";
    var hash: [crypto.hash.sha2.Sha256.digest_length]u8 = undefined;
    crypto.hash.sha2.Sha256.hash(dados, &hash, .{});

    try stdout.print("SHA-256: ", .{});
    for (hash) |byte| {
        try stdout.print("{x:0>2}", .{byte});
    }
    try stdout.writeAll("\n");

    // BLAKE3
    var blake_hash: [crypto.hash.Blake3.digest_length]u8 = undefined;
    crypto.hash.Blake3.hash(dados, &blake_hash, .{});

    try stdout.print("BLAKE3:  ", .{});
    for (blake_hash) |byte| {
        try stdout.print("{x:0>2}", .{byte});
    }
    try stdout.writeAll("\n");

    // Hash incremental (streaming)
    var hasher = crypto.hash.sha2.Sha256.init(.{});
    hasher.update("parte 1 ");
    hasher.update("parte 2 ");
    hasher.update("parte 3");

    var hash_incremental: [32]u8 = undefined;
    hasher.final(&hash_incremental);

    try stdout.print("SHA-256 (incremental): ", .{});
    for (hash_incremental) |byte| {
        try stdout.print("{x:0>2}", .{byte});
    }
    try stdout.writeAll("\n");
}

Exemplo 2: Geração Aleatória Segura

const std = @import("std");
const crypto = std.crypto;

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();

    // Bytes aleatórios criptograficamente seguros
    var bytes: [32]u8 = undefined;
    crypto.random.bytes(&bytes);

    try stdout.writeAll("Bytes aleatórios: ");
    for (bytes) |b| {
        try stdout.print("{x:0>2}", .{b});
    }
    try stdout.writeAll("\n");

    // Inteiro aleatório em range
    const valor = crypto.random.intRangeAtMost(u32, 1, 100);
    try stdout.print("Número aleatório (1-100): {d}\n", .{valor});

    // Token hexadecimal
    var token: [16]u8 = undefined;
    crypto.random.bytes(&token);

    try stdout.writeAll("Token: ");
    for (token) |b| {
        try stdout.print("{x:0>2}", .{b});
    }
    try stdout.writeAll("\n");

    // Shuffle de um array
    var cartas = [_]u8{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    crypto.random.shuffle(u8, &cartas);

    try stdout.writeAll("Cartas embaralhadas: ");
    for (cartas) |c| {
        try stdout.print("{d} ", .{c});
    }
    try stdout.writeAll("\n");
}

Exemplo 3: HMAC para Autenticação de Mensagens

const std = @import("std");
const crypto = std.crypto;

const HmacSha256 = crypto.auth.hmac.HmacSha256;

fn gerarHmac(chave: []const u8, mensagem: []const u8) [HmacSha256.mac_length]u8 {
    var mac: [HmacSha256.mac_length]u8 = undefined;
    HmacSha256.create(&mac, mensagem, chave);
    return mac;
}

fn verificarHmac(chave: []const u8, mensagem: []const u8, mac_esperado: []const u8) bool {
    var mac: [HmacSha256.mac_length]u8 = undefined;
    HmacSha256.create(&mac, mensagem, chave);

    // Comparação em tempo constante (previne timing attack)
    return std.crypto.utils.timingSafeEql([HmacSha256.mac_length]u8, mac, mac_esperado[0..HmacSha256.mac_length].*);
}

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();

    const chave = "minha-chave-secreta-muito-longa";
    const mensagem = "Transferir R$1000 para conta 12345";

    // Gera HMAC
    const mac = gerarHmac(chave, mensagem);

    try stdout.writeAll("Mensagem: ");
    try stdout.print("{s}\n", .{mensagem});
    try stdout.writeAll("HMAC:     ");
    for (mac) |byte| {
        try stdout.print("{x:0>2}", .{byte});
    }
    try stdout.writeAll("\n");

    // Verifica
    const valido = verificarHmac(chave, mensagem, &mac);
    try stdout.print("Verificação: {}\n", .{valido});

    // Mensagem adulterada
    const adulterada = "Transferir R$9999 para conta 12345";
    const invalido = verificarHmac(chave, adulterada, &mac);
    try stdout.print("Adulterada:  {}\n", .{invalido});
}

Algoritmos Disponíveis

CategoriaAlgoritmos
HashSHA-256, SHA-512, SHA3-256, BLAKE2b, BLAKE3
AEADAES-128-GCM, AES-256-GCM, ChaCha20-Poly1305
MACHMAC-SHA256, Poly1305
AssinaturaEd25519
Troca de chavesX25519
KDFHKDF
SenhaArgon2, bcrypt

Módulos Relacionados

Tutoriais e Receitas Relacionados

Continue aprendendo Zig

Explore mais tutoriais e artigos em português para dominar a linguagem Zig.