Prova de conhecimento
Na criptografia, uma prova de conhecimento é uma prova interativa na qual o provador consegue "convencer" um verificador de que sabe algo. O que significa para uma máquina "saber algo" é definido em termos de computação. Uma máquina "sabe algo" se esse algo puder ser computado, dado à máquina como entrada. Como o programa do provador não necessariamente produz o conhecimento em si (como é o caso das provas de conhecimento zero[1]), uma máquina com um programa diferente, chamado extrator de conhecimento, é introduzida para capturar essa ideia. Estamos principalmente interessados no que pode ser provado por máquinas limitadas em tempo polinomial. Nesse caso, o conjunto de elementos de conhecimento é limitado a um conjunto de testemunhas de alguma linguagem em NP.
Seja uma declaração da linguagem em NP, e o conjunto de testemunhas para x que devem ser aceitas na prova. Isso nos permite definir a seguinte relação:
Uma prova de conhecimento para a relação com erro de conhecimento é um protocolo de duas partes com um provador e um verificador com as duas propriedades a seguir:
- Completude: Se , então o provador que conhece a testemunha para consegue convencer o verificador de seu conhecimento. Mais formalmente: , ou seja, dada a interação entre o provador P e o verificador V, a probabilidade de o verificador ser convencido é 1.
- Validade: A validade requer que a probabilidade de sucesso de um extrator de conhecimento em extrair a testemunha, dado acesso oracular a um provador possivelmente malicioso , seja pelo menos tão alta quanto a probabilidade de sucesso do provador em convencer o verificador. Essa propriedade garante que nenhum provador que não conheça a testemunha consiga convencer o verificador.
Detalhes sobre a definição
[editar | editar código]Esta é uma definição mais rigorosa de Validade:[2]
Seja uma relação de testemunha, o conjunto de todas as testemunhas para o valor público , e o erro de conhecimento. Uma prova de conhecimento é -válida se existir uma máquina de tempo polinomial , dado acesso oracle a , tal que para cada , é o caso que e .
O resultado significa que a máquina de Turing não chegou a uma conclusão.
O erro de conhecimento denota a probabilidade de que o verificador possa aceitar , mesmo que o provador não conheça de fato uma testemunha . O extrator de conhecimento é usado para expressar o que se entende por conhecimento de uma máquina de Turing. Se pode extrair de , dizemos que conhece o valor de .
Esta definição da propriedade de validade é uma combinação das propriedades de validade e validade forte.[2] Para pequenos erros de conhecimento , como por exemplo ou , ela pode ser vista como sendo mais forte do que a solidez de provas interativas comuns.
Relação com provas interativas gerais
[editar | editar código]Para definir uma prova de conhecimento específica, é necessário não apenas definir a linguagem, mas também as testemunhas que o verificador deve conhecer. Em alguns casos, provar a pertinência a uma linguagem pode ser fácil, enquanto calcular uma testemunha específica pode ser difícil. Isso é melhor explicado usando um exemplo:
Seja um grupo cíclico com gerador no qual se acredita que resolver o problema do logaritmo discreto seja difícil. Decidir a pertinência à linguagem é trivial, pois todo está em . No entanto, encontrar a testemunha tal que seja válido corresponde a resolver o problema do logaritmo discreto.
Protocolos
[editar | editar código]Protocolo de Schnorr
[editar | editar código]Uma das provas de conhecimento mais simples e frequentemente utilizadas, a prova de conhecimento de um logaritmo discreto, deve-se a Schnorr.[3] O protocolo é definido para um grupo cíclico de ordem com gerador .
Para provar o conhecimento de , o provador interage com o verificador da seguinte forma:
- Na primeira rodada, o provador se compromete com a aleatoriedade ; portanto, a primeira mensagem também é chamada de compromisso.
- O verificador responde com um desafio escolhido aleatoriamente.
- Após receber , o provador envia a terceira e última mensagem (a resposta) módulo reduzido à ordem do grupo.
O verificador aceita, se .
Podemos ver que esta é uma prova de conhecimento válida porque possui um extrator que funciona da seguinte maneira:
- Simule o provador para gerar . O provador está agora no estado .
- Gere um valor aleatório e insira-o no provador. Ele gera .
- Retorne o provador para o estado . Agora gere um valor aleatório diferente e insira-o no provador para obter .
- Imprima .
Como , a saída do extrator é precisamente .
Este protocolo é de conhecimento zero, embora essa propriedade não seja necessária para uma prova de conhecimento.
Protocolos Sigma
[editar | editar código]Protocolos que possuem a estrutura de três movimentos acima (comprometimento, desafio e resposta) são chamados de protocolos sigma.[4] A nomenclatura se origina de Sig, referindo-se ao zigue-zague que simboliza os três movimentos do protocolo, e MA, uma abreviação de "Merlin e Arthur".[5] Os protocolos sigma existem para provar várias afirmações, como aquelas referentes a logaritmos discretos. Usando essas provas, o provador pode não apenas provar o conhecimento do logaritmo discreto, mas também que o logaritmo discreto possui uma forma específica. Por exemplo, é possível provar que dois logaritmos de e em relação às bases e são iguais ou preenchem alguma outra relação linear. Para os elementos a e b de , dizemos que o provador prova o conhecimento de e tais que e . A igualdade corresponde ao caso especial em que a =1 e b = 0. Como pode ser calculado trivialmente a partir de , isso equivale a provar o conhecimento de um x tal que .
Esta é a intuição por trás da seguinte notação,[6] que é comumente usada para expressar o que exatamente é provado por uma prova de conhecimento.
- ,
afirma que o provador conhece um x que preenche a relação acima.
Aplicações
[editar | editar código]Provas de conhecimento são ferramentas úteis para a construção de protocolos de identificação e, em sua variante que não é interativa, esquemas de assinatura. Tais esquemas são:
Elas também são usadas na construção de sistemas de credenciais digitais anônimas e assinatura de grupo.
Ver também
[editar | editar código]Referências
[editar | editar código]- ↑ Shafrira Goldwasser, Silvio Micali, and Charles Rackoff. The knowledge complexity of interactive proof-systems. Proceedings of 17th Symposium on the Theory of Computation, Providence, Rhode Island. 1985. Draft. Extended abstract
- ↑ a b Mihir Bellare, Oded Goldreich: On Defining Proofs of Knowledge. CRYPTO 1992: 390–420
- ↑ C P Schnorr, Efficient identification and signatures for smart cards, in G Brassard, ed. Advances in Cryptology – Crypto '89, 239–252, Springer-Verlag, 1990. Lecture Notes in Computer Science, nr 435
- ↑ [1] On Sigma protocols
- ↑ [2] Modular Design of Secure yet Practical Cryptographic Protocols
- ↑ Proof Systems for General Statements about Discrete Logarithms