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.

Ilustração mostrando como uma assinatura digital é criada a partir de uma chave privada e prova que você é o dono da chave pública.

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:

Diagrama mostrando dados de transação contendo uma entrada com uma trava.

Mas, se você colocar sua chave privada diretamente nos dados da transação, todos na rede conseguirão vê-la:

Diagrama mostrando dados de transação com uma entrada sendo destravada usando uma chave privada diretamente.

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:

Diagrama mostrando dados de transação com uma entrada sendo destravada usando uma assinatura digital.

É 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:

Diagrama mostrando como uma assinatura digital é criada usando uma chave privada e alguns dados de transação.

Portanto, cada assinatura digital está conectada à transação em que está sendo usada:

Diagrama mostrando como uma assinatura digital está atrelada aos dados da 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.

Diagrama mostrando como uma assinatura digital precisa estar contida nos mesmos dados de transação usados para criá-la para ser válida.

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:

  1. Assinar: Você combina a chave privada + os dados da transação e usa alguma matemática para criar uma assinatura digital.
  2. 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:

  1. Uma parte aleatória.
  2. 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):

Diagrama mostrando o ponto gerador sendo multiplicado por um número aleatório grande.

A parte aleatória da nossa assinatura digital é o ponto na curva ao qual chegamos. Mas vamos pegar apenas a coordenada x dele:

Diagrama mostrando a coordenada x sendo extraída do ponto aleatório na curva.

Vamos chamar isso de "r", abreviando.

Ilustração mostrando r (a coordenada x do ponto aleatório) como a primeira parte de uma assinatura digital.
  • 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).

Diagrama mostrando r sendo multiplicado pela chave privada.

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:

Diagrama mostrando a mensagem que queremos assinar sendo somada a (r multiplicado pela chave privada).

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:

Diagrama mostrando a parte aleatória da assinatura sendo dividida por r.

E pronto, temos a parte vital de "assinatura" da nossa assinatura digital. Vamos chamá-la de s, abreviando.

Ilustração mostrando r e s como as duas partes de uma assinatura digital.

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:

Diagrama mostrando o ponto 1 na curva elíptica durante a verificação da assinatura.

Ponto 2

Divida r por s. O segundo ponto é então a chave pública multiplicada por esse valor:

Diagrama mostrando o ponto 2 na curva elíptica durante a verificação da assinatura.

Verificação

Agora, se somarmos esses dois pontos, obteremos um terceiro ponto na curva:

Diagrama mostrando o resultado de somar o ponto 1 e o ponto 2 na curva elíptica.

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.

Diagrama mostrando a coordenada x do ponto 3 sendo igual à coordenada x do ponto aleatório na assinatura.

Esta é uma explicação simplificada da matemática envolvida nas assinaturas digitais. Para uma explicação mais técnica, veja ECDSA.

Recursos