Um Random Number Generator, ou RNG, é um dispositivo ou programa que produz valores numéricos. Uma carteira precisa de um gerador criptograficamente seguro: conhecer resultados anteriores ou o horário da criação não deve permitir que um atacante preveja o novo segredo de forma viável. Isso depende da fonte de entropia, do algoritmo e de como a aplicação os utiliza. Aqui, entropia descreve a incerteza que um atacante ainda tem sobre o resultado.
Imagine uma carteira que derivasse seu segredo apenas do horário atual. O resultado poderia parecer complicado, mas alguém que soubesse quando ela foi criada teria muito menos possibilidades para testar. A RFC 4086 alerta justamente para entradas previsíveis assim. Um gerador adequado para jogos ou simulações pode não servir para chaves. Nem mesmo uma boa distribuição estatística comprova, sozinha, a segurança. [2]
Geralmente, várias partes trabalham juntas. Uma fonte fornece incerteza, sua saída é processada conforme necessário e um gerador determinístico criptográfico produz outros valores a partir de um estado interno secreto. Determinístico significa que o mesmo estado interno e as mesmas entradas produzem o mesmo resultado. Por isso, esse estado precisa permanecer secreto. A aplicação os solicita por uma interface do sistema. Cada bit devolvido não exige uma nova medição física. A NIST SP 800-90C descreve a combinação de geradores segundo a 90A com fontes segundo a 90B. [1]
No BIP39, a base para recuperar a carteira surge antes da primeira palavra: o gerador produz de 128 a 256 bits de entropia inicial. Um bit é uma unidade básica de informação, com dois valores possíveis: zero e um; o importante é que o atacante não consiga prever a sequência resultante. Acrescenta-se uma soma de verificação, um valor curto que ajuda a detectar alguns erros de transcrição, e o conjunto é convertido em palavras de recuperação. Você pode complementá-las com uma passphrase, um texto secreto adicional. A função PBKDF2 deriva dessas entradas um seed de 512 bits, o valor secreto inicial usado para derivar as chaves da carteira. Nem uma saída maior nem uma soma de verificação acrescentam a aleatoriedade que falta. Por isso, não escolha suas próprias palavras de recuperação. [6]
O dispositivo precisa detectar falhas, como uma fonte de ruído que passe a repetir o mesmo valor. A NIST SP 800-90B exige verificações na inicialização e durante o funcionamento, além do tratamento das falhas encontradas. Não se pode ignorar um erro e continuar apresentando a saída como aleatoriedade verificada. Esses testes monitoram a fonte; não garantem a segurança de toda a carteira. [3]
Um gerador determinístico mantém um estado interno para calcular resultados futuros. A NIST SP 800-90A descreve sua criação, geração, adição de entropia nova (reseed) e encerramento. Se o estado vazar, apenas chamar o gerador novamente pode não restaurar a segurança. A recuperação exige um procedimento adequado e entropia nova desconhecida pelo atacante. Isso não retira de suas mãos as chaves já expostas. [7]
Você não precisa programar seu próprio RNG. Procure saber se a geração e o tratamento de erros estão documentados para a versão específica da carteira. Os termos “hardware” ou “offline” não comprovam isso. Uma análise deve cobrir a fonte, o algoritmo, a inicialização e a interface da aplicação. Mesmo um segredo bem gerado perde sua proteção se você revelar depois o backup. [1] [2]
Por padrão, getrandom() no Linux espera a inicialização de urandom; com GRND_NONBLOCK, pode devolver EAGAIN em vez de esperar. Após a inicialização, uma solicitação a urandom de até 256 bytes tem garantia de leitura completa sem interrupção por sinal. Solicitações maiores não têm essa garantia. O programa precisa verificar o retorno e a quantidade de bytes efetivamente recebida. [4]
Web Crypto oferece getRandomValues() para preencher um array de inteiros compatível com valores criptograficamente fortes. Acima de 65536 bytes, lança QuotaExceededError. Para chaves de algoritmos compatíveis, a especificação recomenda generateKey(); não se trata de um gerador universal de carteiras Bitcoin. O uso correto da API também não comprova a confiabilidade da página: seu código pode acessar o segredo gerado. [5]
Para ter uma visão mais completa, leia este verbete junto com Cryptographic Entropy, CSPRNG, Seed Generation, Brute Force Search Space. Também há referências a este verbete em CSPRNG, Deterministic RNG, True Random Number Generator, Seed Generation.