Criptografia 101: Assinaturas Turbinadas
Este é parte de uma série de artigos sobre criptografia. Se este é o primeiro artigo que você encontra, eu recomendo começar do início da série.
Se você tem acompanhado a série, então já viu sua boa dose de loucuras criptográficas. Especialmente no artigo anterior. Ainda assim... Isso é apenas a ponta do iceberg.

Há muito mais para aprender. Podemos fazer muito mais com curvas elípticas (e grupos em geral, para ser justo). Em particular, assinaturas digitais têm algumas variantes elegantes que se mostram extremamente úteis no contexto certo. Este será o tópico do artigo de hoje.
Um Aviso Amigável
Acredito que é neste ponto da série onde a matemática fica um pouco mais apimentada que o usual. A complexidade dos protocolos que vão ser apresentados é um pouco maior. Se você está aqui apenas para ter uma ideia geral das técnicas criptográficas, então sugiro ler apenas a introdução de cada tópico. Farei o meu melhor para manter as introduções simples e autocontidas, para que forneçam uma boa ideia geral, sem o incômodo de entender a matemática.
Vamos lá!
Assinaturas Cegas
Em alguns casos, pode ser necessário assinar informações privadas. Por exemplo, em um sistema de votação, um usuário pode querer manter seu voto privado, mas exigir aprovação de algum terceiro. Este último teria que assinar o voto às cegas — sem saber qual é o voto do usuário.
Claro, mesmo que isso seja tecnicamente possível, uma assinatura cega deve ser implementada com cuidado. Você não quer estar assinando às cegas uma transação que vai zerar sua conta!

Ainda assim, quando as assinaturas cegas são necessárias, há muitas maneiras de construí-las. Uma possibilidade é adaptar esquemas de assinatura existentes. Em particular, adaptar assinaturas Schnorr é bastante simples. Vamos tentar isso!
O ponto é que André não sabe o que está assinando — ele vai ser solicitado por Bruna a assinar alguma mensagem que ela previamente cega ou mascara. E depois de criar a assinatura, Bruna tem uma maneira de desmascarar, para que a verificação funcione com sua mensagem original.

Em resumo:
As assinaturas cegas permitem a assinatura de informações privadas
O Protocolo
Começamos como de costume: André tem chave privada e chave pública . Ele será nosso assinante. Como sempre, é um gerador para o grupo de curva elíptica escolhido, e tem ordem .
O processo começa com André escolhendo um inteiro aleatório , e calculando . Ele envia isso para Bruna, e então ela inicia o procedimento de cegamento:
- Bruna escolhe um inteiro aleatório , que é chamado de fator de cegamento,
- Ela então calcula:
- E usa isso para calcular um desafio:
- Finalmente, ela também cega o desafio:
Tudo que resta é André assinar. Ele recebe , e simplesmente calcula a assinatura como de costume:
Neste exemplo particular, Bruna não precisa fazer nada ao receber a assinatura — a saída é simplesmente . Mas em geral, é possível que ela precise reverter o processo de cegamento em outras versões de assinaturas cegas.
A verificação acontece exatamente como no caso padrão de assinatura Schnorr:
Se isso for igual a , então será exatamente igual ao desafio , e a assinatura é aceita. E este deveria ser o caso, porque:
Como um relógio suíço, vemos que um corretamente calculado deveria de fato verificar a assinatura (porque recuperamos o desafio original).
A propósito, estou propositalmente omitindo as operações módulo , por simplicidade. Mas para tratamento rigoroso, elas deveriam ser incluídas na demonstração.
Assinatura cega, check. Não é tão louco, né?
Agora que aquecemos, vamos subir o nível...
Assinaturas em Anel
Toda vez que você assina digitalmente algo, a verificação acontece com conhecimento de sua chave pública. Portanto, você não tem anonimato: sua chave pública o identifica como um indivíduo portador de uma chave privada. Mas, você acreditaria se eu te dissesse que há uma maneira de assinar coisas anonimamente?
As assinaturas em anel oferecem tal funcionalidade. A premissa é que uma única pessoa em um grupo de pessoas gera uma assinatura que não revela quem no grupo foi o assinante original. Algo assim:

Novamente, como um breve resumo preliminar:
As assinaturas em anel permitem que um usuário em um grupo crie uma assinatura que poderia ter sido produzida por qualquer membro do grupo, preservando assim o anonimato do usuário
Criando o Anel
Para conseguir esse comportamento de anonimato, primeiro devemos forjar uma estrutura nova e um pouco incomum, chamada anel.

O conceito de um anel é o de um conjunto ordenado (neste caso, de participantes), e cuja ordem determina uma série de cálculos começando de um valor , e terminando no mesmo valor . E como sempre, a ideia é que criar essa sequência de computações só é viável com conhecimento de uma chave privada.
A propósito, este não é um anel como na estrutura algébrica abstrata. Falaremos sobre esses mais tarde.
Então, para a configuração: o anel tem participantes, que como mencionado anteriormente, são ordenados. Isto é, André é o participante , Bruna é a participante , e assim por diante.
Sara, que é a participante , tem conhecimento das chaves públicas de todos os outros participantes — vamos denotar essas como . Ela também tem seu próprio par de chaves privada e pública, que serão e .
Para produzir uma assinatura para uma mensagem , Sara faz o seguinte:
- Ela escolhe um inteiro aleatório , e calcula .
- Ela então calcula uma semente, .
Esta semente será usada para um processo iterativo. Ela começa definindo , e então para cada outro dos participantes no anel:
- Ela escolhe um valor aleatório , e calcula:
- E calcula o próximo desafio:
Eventualmente, Sara faz isso para todos os participantes, obtendo um desafio final, que chamaremos apenas de . Ela faz isso em ordem, começando por ela mesma (s), e então calculando . Ela continua com este processo, e ao chegar ao participante , então ela conta de até . Isso é crucial, porque a assinatura será avaliada exatamente nesta mesma ordem.
Tudo que resta é ela fechar o anel, significando que a computação final deveria retornar o valor inicial, então . Para isso, ela tem que encontrar algum valor tal que:
Como sabemos que , tudo que precisamos é encontrar um valor de tal que . Reorganizando um pouco:
Podemos obter o valor desejado para . A assinatura final é a tupla:
É importante que os valores sejam fornecidos na ordem do anel. Sara estará em algum lugar no meio, escondida...

Aqui está uma representação visual de todo o processo de assinatura, para ajudar a entender melhor todos os passos envolvidos:

Verificação
Tudo que resta é verificar a assinatura. Para isso, Bruna começa de , e calcula o seguinte para cada participante :
- O valor
- E o próximo desafio, como:
Se o loop se fecha corretamente, significando que o desafio final produz exatamente , então ela aceita a assinatura. Note que o anel se fecha porque nos asseguramos de encontrar um adequado para Sara! E fizemos isso usando a chave privada de Sara — se não a conhecêssemos, então encontrar o certo não é uma tarefa fácil.
Do ponto de vista do verificador, todos os valores são indistinguíveis uns dos outros (são apenas números), então ela não pode saber qual é o calculado — lembre-se que os outros são apenas aleatórios!
Tudo bem, isso foi certamente muito!
Aviso: somatórias pela frente. Respire fundo. Hidrate-se. Pause por um minuto.
Pronto? Vamos continuar.
Multiassinaturas
A ideia é simples: o que acontece se precisássemos de múltiplos participantes para assinar algo? E isso não é tão absurdo: é frequentemente um requisito ao assinar documentos legais do mundo físico. Parece uma extensão muito natural.
Multiassinaturas são especialmente úteis ao assinar operações sensíveis. Por exemplo, ações administrativas em uma aplicação podem exigir uma assinatura de múltiplos membros de uma organização. Isso garante que nenhum ator único tenha privilégios administrativos, e que não existe um único ponto de falha.

Seguindo o padrão dos exemplos anteriores, vamos dar um breve resumo antes de mergulhar na matemática:
As multiassinaturas permitem que múltiplos usuários assinem uma única mensagem, de modo que a assinatura não é válida se não foi assinada por usuários suficientes
Há múltiplas maneiras de fazer isso.
Multiassinaturas Schnorr
Assinaturas Schnorr têm uma propriedade muito boa: elas são lineares. Simplificando, isso significa que podemos somar assinaturas individuais e ainda acabar com uma assinatura válida. Não há inversos multiplicativos complicados na mistura que poderiam potencialmente complicar as coisas.
Por causa disso, podemos adaptar o esquema que já apresentamos, para que múltiplos participantes possam assinar uma mensagem.
A configuração é ligeiramente diferente do usual: cada um dos participantes tem uma chave privada , e tem uma chave pública como . Também precisaremos de uma chave pública combinada , calculada como:
Note que este é exatamente o mesmo resultado como se tivéssemos somado as chaves privadas primeiro, e então calculado :
Depois, a assinatura acontece da seguinte forma:
- Cada participante escolhe um número aleatório , e calcula .
- Então, os individuais são combinados assim:
- Com isso, um desafio é calculado como .
- Então, cada participante calcula uma assinatura individual :
- Finalmente, as assinaturas parciais são somadas para produzir um único , como:
E como antes, a assinatura produzida é o par . Curiosamente, este par é verificado exatamente como uma assinatura Schnorr normal! O verificador calcula , e aceita se . É aqui que a linearidade entra: podemos mostrar que deveria ser igual a , e assim a assinatura deveria funcionar.
Lembre-se que estou propositalmente omitindo as operações módulo para manter as coisas o mais simples e limpas possível. Tratamento rigoroso requer que você leve a operação em conta!
E assim, múltiplos participantes produziram uma única assinatura! Legal!
Assinaturas de Limite
Assinaturas de limite oferecem uma funcionalidade ligeiramente mais avançada. O termo limiar alude ao fato de que um certo número mínimo de assinantes será necessário para que a assinatura seja válida. Precisamos de participantes de um grupo de pessoas para se engajarem na assinatura, para produzir uma assinatura.
Como sempre, vamos precisar de uma chave privada. Mas como antes, o ponto é que nenhum ator único a conhece — eles apenas possuem partes ou pedaços dela. Conseguir isso no caso de assinaturas de limiar não é trivial — não dá pra simplesmente escolher um inteiro aleatório, como era o caso para outros esquemas.

De fato, geração de chaves é um passo crucial para assinaturas de limiar funcionarem.
Honestamente, entender assinaturas de limiar envolve usar polinômios, que ainda não cobrimos. Eles serão o tópico central em próximas partes. Por enquanto, devemos nos contentar em saber sobre a existência deste tipo de assinaturas. Voltaremos a elas mais tarde na série.
Resumo
As assinaturas vêm em muitas formas diferentes. No final, é tudo sobre criar um jogo criptográfico que tem propriedades específicas. Qualquer necessidade que você possa ter, provavelmente consegue criar uma estratégia que a cubra.
Você precisa de assinatura anônima mas com um admin que pode revogar assinaturas? As assinaturas de grupo estão aí para salvar o dia. Quer alterar a mensagem, mas manter uma assinatura válida? Aa assinaturas homomórficas são a sua praia.
Agora vimos um número significativo de aplicações criptográficas baseadas em grupos. É hora de aprofundarmos nosso entendimento de grupos um passo adiante — então da próxima vez, veremos homomorfismos e isomorfismos de grupos. E por sua vez, cobriremos uma nova técnica criptográfica útil.