Para quem ler, reuni muito mais informações sobre isso. Aqui está o que eu aprendi.

1. Derivação -chave

Na criptografia da curva elípica, a derivação -chave é praticamente a mesma e independente do esquema de assinatura. É baseado no Problema de logaritmo discretoE uma vez que a curva específica é definida, derivar as chaves é bem direto. O problema discreto do logaritmo diz que é dado:

  • Um primo muito grande p Isso é específico para a curva,
  • um campo F_p com módulo de operações aritméticas pAssim,
  • um valor arbitrário x \ em f_pAssim,
  • um ponto P expresso como um par de coordenadas afins (ou alternativamente como um triplo de coordenadas projetivas) em F_pAssim,
  • uma operação especial de soma entre pontos em que não estou investigando aqui, mas é fornecido no pasta_curves Crate,
  • e Q = x \ cdot p (Significando isso P é adicionado x tempos com a operação de soma acima mencionada),

É inviável recuperar x de Q sabendo apenas P. Portanto, a geração de chaves na criptografia da curva elípica é bastante direta:

  • inventar um aleatório x E essa é a chave privada;
  • A chave pública é P = x \ cdot gcom G sendo um ponto especial da curva conhecida como gerador;
  • converter P afinar coordenadas para reduzi-lo a um par de números de 256 bits;
  • Use apenas a coordenada X para comunicar a chave pública, pois a coordenada Y é obtida simplesmente avaliando a curva elíptica em x; Dessa forma, a chave pública é um único número de 256 bits.

Com tudo isso, a resposta para minha pergunta original é: Sim, o ff e pasta_curves Crates são mais do que suficientes para derivar teclados de macarrão (se alguém está disposto a correr o risco de implementar uma quantidade menor de criptografia).

2. Esquema de assinatura

Aprendi que a Eddsa nem é a melhor escolha para a facilidade de arrepiar. Schnorr é melhor! (Aiui Schnorr é mais geral que o Eddsa, mas não me cite nisso.)

Existem algumas caixas para lidar com Schnorr, mas novamente, uma vez que você tiver coisas como ff A matemática por trás disso parece ser tão direta que vale a pena correr o risco de implementar uma quantidade de criptografia em primeira mão, em primeira mão, em primeira mão, em primeira mão, em vez do ônus de uma dependência extra (que pode ficar obsoleta, pode não ser mais mantida etc.).

Eu acho que vale a pena resumir os algoritmos de assinatura e verificação da Schnorr aqui para qualquer pessoa interessada. Se alguém perceber erros, ligue para eles e eu editarei.

Definições

  • G = o ponto do gerador da curva.
  • p = um grande primo específico para a curva.
  • n = um nonce aleatório secreto em F_p.
  • m = A mensagem a ser assinada (também deve conter seu próprio nonce / timestamp / o que for para evitar ataques de reprodução).
  • x = A chave privada do assinante.
  • P = A chave pública do assinante.
  • H = uma função de hash adequada (Poseidon é recomendado para a simpatia de ZK-Snark).

Assinatura de Schnorr

  • Gerar o nonce n (tal que n \ em f_p) com um prng criptográfico.
  • Calcule o ponto de comprometimento de Nonce:

N = n \ cdot g

  • Calcule o hash de desafio:

c = h (n || p || m)

  • Calcule a resposta escalar:

s = n + c \ cdot x \ mod {p}

  • A assinatura é o par

(N, s)

Observação: x permanece secreto e irrecuperável de (N, s) porque:

  • n é irrecuperável de N devido ao problema logarítmico discreto;
  • Se você não sabe n Você não pode resolver o s equação para x.

AVISO #1: é importante que n permanece em segredo, caso contrário, qualquer pessoa pode obter sua chave privada resolvendo:

\ Begin {alinhado} s & = n + c \ cdot x \ mod {p} \\ x & = \ frac {s – n} {c} \ mod {p} \ end {alinhado}

onde a divisão acabou F_p é realizado multiplicando pelo modulo inversop de c.

AVISO #2: Nunca reutilize o mesmo aleatório n Para assinar duas mensagens diferentes, caso contrário, a recuperação de chave privada completa se torna possível resolvendo:

\ begin {alinhado} s_1 & = n + c_1 \ cdot x \ mod {p} \\ s_2 & = n + c_2 \ cdot x \ mod {p} \\ \ end {alinhado}

\ frac {s_1 – s_2} {c_1 – c_2} = \ frac {n + c_1 \ cdot x – n – c_2 \ cdot x} {c_1 – c_2} = x \ cdot \ frac {c_1 – c_2} {c_2 – c_2}

Observe que não funciona se c_1 = c_2 Porque nesse caso S_1 = S_2 E você acaba com

\ frac {s_1 – s_2} {c_1 – c_2} = \ frac00

que é uma forma indeterminada. Então, uma única assinatura para um dado c não permite recuperação de chave privada.

Então, tenha certeza n é fresco (e criptograficamente seguro) para cada nova assinatura.

Assinar a mesma mensagem com dois inconces diferentes está bem.

Verificação de Schnorr

  1. Calcule o hash de desafio:

c = h (n || p || m)

  1. Verifique a equação:

s \ cdot g \ Stackrel {?} {=} n + c \ cdot p

3. Conclusões

Com tudo isso, temos dois primitivos criptográficos fundamentais (um hash e um esquema de assinatura) que são altamente eficientes para os circuitos ZK-Snark, especialmente o Halo2, pois estamos usando o mesmo campo. Isso provavelmente faz de Poseidon e Poseidon-Schnorr as melhores opções para iniciar um novo projeto de blockchain hoje, já que o Halo2-Friendless nos compra a capacidade de construir provas recursivas (e, portanto, ZK-Rollups). Além disso, o Halo2 é significativamente mais fácil de usar do que outros esquemas, pois não requer nenhuma configuração confiável.

Fontesethresear

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *