Um CSPRNG é um gerador de números pseudoaleatórios criptograficamente seguro. Ele calcula novos valores a partir de um estado interno secreto, seguindo um procedimento preciso. “Pseudoaleatório” não significa baixa qualidade: o cálculo é reproduzível, mas, sem conhecer o estado secreto, os resultados devem ser imprevisíveis na prática. Isso exige entropia suficiente, ou seja, incerteza sobre as entradas do ponto de vista do atacante, e integração correta na aplicação.
Imagine um programa criando valores secretos para uma carteira. Um atacante descobre alguns resultados anteriores. Um gerador seguro não deve permitir que essa informação facilite adivinhar os restantes. É uma exigência maior do que uma distribuição bonita de números num gráfico. Por isso, RFC 4086 distingue sequências criptograficamente fortes de geradores comuns para simulações. Nem um bom resultado em testes estatísticos basta se o seed, o valor inicial da geração, puder ser adivinhado. [1]
A documentação técnica também usa DRBG: gerador determinístico de bits aleatórios. “Determinístico” significa que o mesmo estado e as mesmas entradas produzem o mesmo resultado; por isso, o estado precisa permanecer secreto. NIST SP 800-90A Rev. 1 descreve mecanismos específicos: Hash_DRBG, HMAC_DRBG e CTR_DRBG. São procedimentos técnicos, não um selo de qualidade para qualquer programa que mencione seus nomes. Também é preciso analisar a configuração, a origem da entropia e a implementação real no código. [2]
Um vazamento do estado levanta duas perguntas diferentes. O atacante consegue reconstruir resultados secretos anteriores? Consegue prever os próximos? A proteção dos resultados passados chama-se Backtracking resistance; a dos futuros, Prediction resistance. Para esta última, NIST SP 800-90A exige a incorporação eficaz de entropia nova, separando os novos resultados do estado exposto. Apenas executar o cálculo novamente pode não restaurar a segurança. Ter uma dessas proteções também não demonstra automaticamente a outra. [2]
Uma biblioteca é um componente de software pronto que a carteira pode usar, mas uma chamada a ela pode falhar. No OpenSSL 3.5, RAND_bytes() e RAND_priv_bytes() retornam 1 em caso de sucesso, 0 em outra falha e -1 se o método atual não for suportado. A geração pode ser recusada quando a fonte de entropia falha. O programa precisa verificar esse retorno antes de usar a área de memória reservada, chamada buffer. Caso contrário, pode usar dados que nunca foram gerados com segurança. [3]
A repetibilidade ajuda nos testes: o desenvolvedor quer comparar o resultado com o esperado. Por isso, a função randombytes_buf_deterministic() da libsodium produz a mesma sequência a partir do mesmo seed. No uso normal, porém, uma repetição involuntária é um problema. Um snapshot de máquina virtual salva o estado do computador, incluindo a memória; restaurá-lo pode repetir também o estado e a saída do gerador. Cópias do ambiente, portanto, não necessariamente produzem segredos independentes. [4]
Um gerador pode fornecer bons dados aleatórios que a aplicação processa incorretamente. Convertê-los para um intervalo permitido menor usando apenas o resto de uma divisão pode tornar certos resultados mais frequentes do que outros. A função randombytes_uniform() da libsodium evita esse problema selecionando uniformemente abaixo de um limite superior definido. As chaves também precisam respeitar as regras de seu algoritmo. A segurança não termina ao obter bytes aleatórios: o uso posterior importa igualmente. [4]
Um nonce é um valor destinado a um uso individual num procedimento criptográfico, mas suas regras dependem do protocolo. RFC 8439 exige que ele não se repita com a mesma chave; parecer aleatório não garante unicidade. RFC 6979 descreve, por sua vez, o cálculo determinístico do valor k necessário para uma assinatura digital a partir da chave secreta e da mensagem assinada. São projetos diferentes, não uma contradição. “Adicionar aleatoriedade em tudo” não substitui o procedimento correto. [5] [6]
O rótulo CSPRNG não informa, sozinho, se a carteira utiliza corretamente o sistema completo. Uma revisão técnica verifica a versão específica da biblioteca, o início do gerador, o tratamento de erros e o comportamento após restaurar ou copiar o estado. A documentação de OpenSSL e libsodium comprova propriedades de suas funções, não a segurança de qualquer aplicação que as chame. Para o usuário, o que vem depois também importa: um segredo perfeitamente gerado deixa de proteger os fundos se vazar um backup que permita recuperar o acesso. [3] [4]
Para ter uma visão mais completa, leia este verbete junto com Cryptographic Entropy, Random Number Generator, Deterministic RNG, Seed Generation. Também há referências a este verbete em Dice Roll Entropy, Cryptographic Entropy, Random Number Generator, Deterministic RNG.