Assinaturas Digitais
O que é uma assinatura digital?
Uma assinatura digital é usada para mostrar que você conhece a chave privada conectada a uma chave pública, sem ter que revelar a chave privada.
Então, se alguém algum dia perguntar se você tem a chave privada de uma chave pública específica (ou endereço), você pode dar a essa pessoa uma assinatura digital para provar.
Por que usamos assinaturas digitais no Bitcoin?
Quando você faz uma transação, você precisa destravar as saídas que quer gastar.
Para isso, você precisa mostrar que "possui" a saída. Isso é feito provando que você conhece a chave privada do endereço ao qual a saída está travada:
Mas, se você colocar sua chave privada diretamente nos dados da transação, todos na rede conseguirão vê-la:
E se alguém conseguir sua chave privada, poderá usá-la para destravar e gastar quaisquer outras saídas que tenham sido travadas a esse mesmo endereço.
Então, como podemos destravar saídas sem entregar nossa chave privada?
Entra em cena a assinatura digital
Uma assinatura digital pode ser criada a partir de uma chave privada para provar que conhecemos a chave privada de um endereço.
Isso significa que podemos usar uma assinatura digital para destravar saídas sem ter que entregar nossa chave privada:
É por isso que usamos assinaturas digitais em vez de colocar nossas chaves privadas diretamente nos dados da transação.
O que impede alguém de reutilizar uma assinatura digital?
Boa pergunta. Afinal, se a chave privada pode destravar qualquer saída travada a um endereço, por que alguém não pode pegar a assinatura digital e usá-la para fazer a mesma coisa?
Resposta: Porque toda assinatura digital está atrelada a uma transação.
Em outras palavras: você não usa só a sua chave privada para criar uma assinatura digital; você usa a sua chave privada e os próprios dados originais da transação:
Portanto, cada assinatura digital está conectada à transação em que está sendo usada:
Então, se alguém tentar usar essa assinatura digital em uma transação diferente, ela não vai bater com os dados da transação que foram usados para criá-la, e os nós da rede bitcoin vão rejeitá-la.
Além disso, a assinatura digital também protege contra qualquer adulteração de uma transação. Porque, se os dados da transação forem alterados (ex.: alguém tenta mudar o valor sendo enviado ou para onde está sendo enviado), a assinatura digital deixará de funcionar.
Como funcionam as assinaturas digitais?
Matemática, a boa e velha matemática.
Há duas partes no uso de assinaturas digitais:
- Assinar: Você combina a chave privada + os
dados da transaçãoe usa alguma matemática para criar uma assinatura digital. - Verificar: Você pode então pegar a assinatura digital + os
dados da transação+ a chave pública, fazer mais alguma matemática, e o resultado confirmará se uma chave privada legítima foi usada para criar a assinatura digital.
Porque, lembre-se, o objetivo de usar uma assinatura digital é provar que você é o dono de uma chave pública.
Não esqueça que um endereço é só uma codificação de uma chave pública. Então, mesmo que você envie bitcoins para um endereço, na verdade está travando-os a uma chave pública.
Eu sei que o processo parece fumaça e espelhos mágica no início, mas, sinceramente, é só matemática por baixo.
Como você cria uma assinatura digital?
Uma assinatura digital contém duas partes:
- Uma parte aleatória.
- Uma parte de assinatura.
1. Parte Aleatória
Comece gerando um número aleatório grande.
Você então o multiplica pelo ponto gerador na curva elíptica (o mesmo ponto gerador usado ao criar uma chave pública):
A parte aleatória da nossa assinatura digital é o ponto na curva ao qual chegamos. Mas vamos pegar apenas a coordenada x dele:
Vamos chamar isso de "r", abreviando.
- Este é basicamente o mesmo processo de criar uma chave privada e uma chave pública. Só que aqui fazemos isso para adicionar um elemento aleatório à nossa assinatura digital.
- Esse elemento aleatório ajuda a garantir que toda assinatura digital seja única.
Então agora temos a primeira metade da nossa assinatura digital pronta, mas ainda não usamos nossa chave privada para nada. É aí que entra a segunda metade…
2. Parte de Assinatura
Em seguida, pegamos nossa chave privada e a multiplicamos por r (a coordenada x daquele ponto aleatório na curva que acabamos de encontrar).
Em seguida, adicionamos aquilo que queremos assinar. Isso é chamado de mensagem. No Bitcoin, a mensagem é o hash de todos os dados da transação que contém a saída que queremos destravar:
Incluir o hash da transação atrela a assinatura a uma única transação (para que não possa ser usada em uma transação diferente).
Por fim, por garantia, dividimos tudo isso por aquele número aleatório inicial com que começamos:
E pronto, temos a parte vital de "assinatura" da nossa assinatura digital. Vamos chamá-la de s, abreviando.

Sr. A. Digital.
Agora vem a parte divertida…
Se alguém nos pedir para provar que conhecemos a chave privada de uma chave pública, podemos dar a essa pessoa nossa assinatura digital (r e s) como prova.
Mas como diabos alguém pode usar isso como prova?
Como você verifica uma assinatura digital?
Para verificar que uma assinatura digital foi feita usando uma chave privada correta, a pessoa a quem você dá essa assinatura digital precisa usar ambas as partes para encontrar dois novos pontos na curva elíptica:
Ponto 1
Divida a mensagem por s. O primeiro ponto é então o ponto gerador multiplicado por esse valor:
Ponto 2
Divida r por s. O segundo ponto é então a chave pública multiplicada por esse valor:
Verificação
Agora, se somarmos esses dois pontos, obteremos um terceiro ponto na curva:
E se a coordenada x desse terceiro ponto for igual à coordenada x do ponto aleatório com que começamos (r), então isso é a prova de que a assinatura digital foi criada usando a chave privada conectada a esta chave pública.
Esta é uma explicação simplificada da matemática envolvida nas assinaturas digitais. Para uma explicação mais técnica, veja ECDSA.
Recursos
- Bitcoin 101: The Magic of Signing & Verifying – Um excelente vídeo introdutório (em inglês) que cobre a matemática de fato por trás da geração e verificação de assinaturas.