Avançado Aula 2 4 min de leitura

Força bruta: quanto custa em tempo e em energia

Um número por vez, com contas honestas de quantos números por segundo e quanto isso custa em eletricidade.

Força bruta é a estratégia mais burra que existe, e é a única disponível quando o alvo é um endereço. Ela também é surpreendentemente rápida, por um motivo que quase ninguém percebe de primeira: ninguém calcula cada chave do zero.

Testar um candidato exige quatro etapas. Multiplicar o gerador pelo número candidato, o que produz a chave pública. Passar a chave pública pela SHA-256. Passar o resultado pela RIPEMD-160. Comparar os vinte bytes com o endereço procurado. A primeira etapa é dezenas de vezes mais cara que as outras três somadas — e é justamente ela que os programas de busca evitam.

O truque é procurar os candidatos em sequência. Se você já tem o ponto correspondente a k, o ponto correspondente a k mais um é aquele ponto somado a G: uma soma, não uma multiplicação inteira. E como toda soma de pontos exige uma divisão no corpo finito, que é a operação cara ali, usa-se um segundo truque, conhecido como inversão em lote: calcula-se uma única inversão para centenas de pontos de uma vez, e o custo por candidato despenca.

Avançar um passo custa quase nada. Recomeçar a medida do zero a cada passo custaria tudo.

Com essas duas otimizações, uma placa de vídeo moderna testa alguns bilhões de candidatos por segundo. É um número que impressiona, e o que ele significa merece ser posto na balança devagar.

Um intervalo de setenta bits tem 2^69 candidatos, o que é aproximadamente 590 quintilhões. Dividindo por três bilhões por segundo, dá cerca de duzentos bilhões de segundos — algo em torno de seis mil e duzentos anos numa placa só. Mil placas em paralelo reduzem isso a pouco mais de seis anos. Dez mil placas, a sete meses.

Agora a conta de luz, que é a que decide de verdade. Uma placa dessas consome perto de quatrocentos watts. Multiplicando pela duração total do trabalho, a varredura completa de setenta bits gasta em torno de vinte e dois gigawatts-hora — o consumo de uma cidade de porte médio durante alguns dias, independentemente de quantas placas você use para chegar lá. Dividir o trabalho entre mais máquinas encurta o calendário e não muda a energia.

Todo esse salão ligado para abrir uma caixa.

E então vem o que estraga tudo: cada bit a mais dobra a conta inteira. Setenta e um bits custam o dobro em tempo e o dobro em energia. Setenta e cinco custam trinta e duas vezes mais. Oitenta bits custam mil vezes mais que setenta — e mil vezes vinte e dois gigawatts-hora é uma quantidade de energia que nenhuma operação privada compra para procurar uma chave.

Os primeiros degraus qualquer um sobe. Os de cima ninguém alcança.

Vale ser exato sobre uma comparação que aparece muito. A rede do Bitcoin inteira calcula em torno de um sextilhão de hashes por segundo, um número centenas de vezes maior que qualquer fazenda de placas de vídeo — e ainda assim ela não serve para isto. Um minerador ASIC sabe fazer uma coisa só, SHA-256 sobre um cabeçalho de oitenta bytes, e não sabe multiplicar pontos numa curva. O hardware que resolve um desafio é outro, e é muito mais lento.

É por isso que a fronteira da força bruta sobre endereços está, hoje, em algum lugar entre setenta e oitenta bits, e não avança porque alguém teve uma ideia melhor: ela avança quando o hardware fica mais barato, e devagar. Nenhuma otimização de software muda a natureza exponencial da parede.

Vale registrar duas advertências práticas. A primeira é que o número de chaves por segundo que os programas anunciam varia muito conforme o que se procura — buscar um endereço específico, buscar qualquer um de uma lista de milhares e buscar por um prefixo são tarefas de custo bem diferente. A segunda é que boa parte dos ganhos anunciados vem de comparar contra uma lista carregada na memória, e não de calcular mais rápido.

Toda essa aula supôs o pior caso: só o endereço é conhecido. Quando a chave pública está exposta, o problema deixa de ser varrer o intervalo e passa a ser um logaritmo discreto — e aí existe um atalho que reduz 2^69 tentativas a algo perto de 2^35. Na próxima aula, o primeiro desses atalhos: trocar memória por tempo.