O que é uma Private Key (Chave Privada)?
O Bitcoin, assim como a maior parte das criptomoedas, usa um sistema criptográfico assimétrico. Ou seja, um sistema baseado em pares de chaves: uma chave pública e uma chave privada.
Desse modo, uma carteira de Bitcoin consiste em um conjunto de chaves públicas e privadas. De modo simplificado, a chave pública (public key) é usada para você receber bitcoins e verificar saldos, enquanto a chave privada (private key) serve para assinar transações a fim de gastar bitcoins.
A pessoa que possui a chave privada tem total controle sobre os fundos daquele endereço. Dessa maneira, ela deve ser guardada em segurança, pois caso uma pessoa tenha acesso à sua chave privada, seus fundos estarão permanentemente perdidos.
Contudo, é aí que entra a genialidade do protocolo: Diferentemente de uma senha bancária, a qual precisa ser constantemente digitada na rede (se tornando um grande vetor para ataques), esse conjunto de chaves pode ser gerado e manuseado sem nenhum contato com a internet. Na realidade, as carteiras mais seguras são aquelas nas quais as chaves privadas nunca entraram em um ambiente com acesso à internet, como hardware wallets, paper wallets e computadores air-gapped (permanentemente offline).
Relação entre Chaves Privadas, Chaves Públicas e Endereços (Public Address)
Conforme explicado, as chaves privadas são usadas para gastar os fundos de um endereço. Além disso, elas também são usadas para gerar a chave pública e o endereço correspondente. A chave privada (private key) é a raiz do endereço bitcoin e da chave pública (public key), sendo ambos derivados da mesma.
Partindo da chave privada, primeiramente é feita uma multiplicação da curva elíptica (uma função criptográfica de sentido único). O resultado dessa operação é a chave pública.
Posteriormente, essa chave pública é submetida a um duplo hashing (outra função criptográfica de sentido único) gerando o endereço bitcoin. Esse endereço é que é usado para receber fundos. Para ver como um hash funciona, veja esse artigo.
Como essas funções criptográficas são de sentido único, a partir do endereço, ou da chave pública, é impossível gerar a chave privada.
Assim podemos seguir com a private key, o foco do artigo.
Private Keys em números
Uma private key é simplesmente um número muito grande. E bota grande nisso. As carteiras de Bitcoin que geram private keys têm 256 bits de entropia. Em outras palavras, uma private key é um número escolhido aleatoriamente entre 1 e 2256.
À primeira vista pode não parecer, mas 2256 é um número incomensuravelmente grande. Usando uma calculadora de números grandes (Big Number Calculator), chegamos a esse número:
115.792.089.237.316.195.423.570.985.008.687.907.853.269.984.665.640.564.039.457.584.007.913.129.639.936
Dessa forma, é muito simples gerar uma private key: basta escolher um número aleatório entre 1 e essa monstruosidade.
O mais importante ao gerar uma private key (ou chave privada) é conseguir uma boa fonte de entropia, isto é, de aleatoriedade. Assim sendo, qualquer número serve desde que esse número não tenha um padrão previsível.
Seres humanos são péssimas fontes de entropia, dessa forma não é recomendável que você escolha um número aleatoriamente da sua cabeça. Por exemplo, números como 1010101010… são péssimos e colocam seus fundos em risco. Desse modo, seus fundos podem ser roubados se você utilizar uma chave insegura.
Não apenas a chave privada deve ser gerada com segurança, por meio de boas fontes de entropia, como também deve ser guardada com segurança. Os fundos não poderão ser recuperados sem a chave privada, caso ela seja perdida.
Gerando uma Private Key fora de um ambiente computacional
No livro Mastering Bitcoin Andreas Antonopoulos sugeriu que é possível gerar uma chave privada (private key) usando somente uma moeda, um papel e uma caneta. Vamos detalhar esse processo passo a passo, que será uma boa forma de entender a formação de uma chave privada.
O processo consiste em jogar uma moeda 256 vezes com a fim de gerar uma private key em formato binário. Vamos ao passo a passo:
- Pegue uma moeda e jogue 256 vezes. Considere cara como 0, e coroa como 1. Anote cada resultado em um papel.
- Ao final você terá uma private key em formato binário. Algo como 1110001101011101… (256 vezes)
- Separe em grupos de 4. Assim você terá 1110 0011 0101 1101…
- Agora use a tabela abaixo para converter seus valores para o formato hexadecimal.
0000 = 0 | 0100 = 4 | 1000 = 8 | 1100 = C |
0001 = 1 | 0101 = 5 | 1001 = 9 | 1101 = D |
0010 = 2 | 0110 = 6 | 1010 = A | 1110 = E |
0011 = 3 | 0111 = 7 | 1011 = B | 1111 = F |
- Alternativamente, você pode inserir seus valores no formato binário no campo abaixo para ver o resultado em hexadecimal.
- Agora o seu número é 4 vezes menor. O número 1110 0011 0101 1101 (256 caracteres)… agora é E35D… (64 caracteres em formato hex)
Pronto, esse valor final é a sua private key em formato hex!!
Agora você pode pegar essa sua private key, em formato hexadecimal com 64 caracteres, e inserir no bitaddress.org para ver qual é o respectivo endereço público!
Formatos de Chaves Privadas
Essa chave privada que acabamos de criar está no formato hex (hexadecimal). Existem outros formatos, que funcionam de maneira idêntica, sendo apenas usados de outras formas.
Os formatos hex e binários são usado apenas internamente dentro dos softwares e raramente são mostrado para o usuário.
O formato WIF (Wallet Import Format) é o mais comum, pois é usado em QR codes. Além disso, esse formato tem 52 caracteres formados numa base 58, na qual foram retirados caracteres que poderiam ser facilmente confundidos, tais como 0 e O, I e l, etc.
Só para ilustrar, segue uma private key em formato hex e WIF:
HEX:3439B2C7E8AA99C4398DBF64001CF8E1AE15FDB380BD784BB52C53FEF7E10AA0 WIF:5JDHcGSg68bwQ8o1oPLgvcoF6XRWbnU2nQornn8KeUEEHynSnHe
Muito cuidado, não use essa private key se você não souber exatamente o que você está fazendo. Esse artigo tem fins puramente educacionais e qualquer erro pode fazer você perder seus fundos para sempre.
Referências:
Antonopoulos, A. (2014). Mastering Bitcoin
Randomly Generated Private Key Outside of a Computer Environment