Esquema de assinatura

ML-DSA-87 explicado matematicamente

Como o ML-DSA-87 (FIPS 204) assina uma avaliação da McGesund — do Module-LWE ao rejection sampling, até à verificação no navegador.

Atualizado: 2026-09-07

1. Do que se trata aqui

Quando alguém submete uma avaliação na McGesund, acontece nos bastidores mais do que o texto deixa supor. Ao ser enviada, a avaliação é assinada digitalmente. Qualquer visitante pode mais tarde recalcular essa assinatura no seu próprio navegador — sem confiar em nós e sem nos perguntar nada.

Para clientes a partir do plano Pro, isso acontece, entre outros, com ML-DSA-87. Este artigo explica o que se passa matematicamente.

Uma nota prévia importante:

ML-DSA não é cifragem. O texto da avaliação continua legível publicamente — é esse justamente o sentido de uma avaliação. O ML-DSA não prova sigilo, mas sim origem e integridade.

O ML-DSA foi desenvolvido a partir do CRYSTALS-Dilithium e está normalizado como FIPS 204. O número 87 designa o nível de parâmetros. Há três:

  • ML-DSA-44
  • ML-DSA-65
  • ML-DSA-87

O ML-DSA-87 é o mais alto e situa-se na categoria de segurança 5 do NIST.


2. O que é exatamente assinado?

Não é o texto da avaliação em si que entra na assinatura, mas um objeto de dados compacto que fixa o texto de forma inequívoca. Na McGesund, no essencial, tem este aspeto:

{
  "v":   1,
  "typ": "rev-comment",
  "f":   "<ID da empresa>",
  "c":   "<ID da avaliação>",
  "h":   "<SHA-256 do texto da avaliação>",
  "rh":  "<SHA-256 de todo o registo de submissão>",
  "rv":  1,
  "qh":  "<SHA-256 do envelope QR, apenas em avaliações por QR>",
  "iat": 1757203200
}

Este objeto é a nossa mensagem mm. Liga entre si seis afirmações:

  1. A que empresa pertence a avaliação (f)
  2. Que avaliação está em causa (c)
  3. Que texto estava por trás — sob a forma de hash (h)
  4. Que registo no seu conjunto foi submetido (rh): texto, corações, estado de geolocalização e dados sobre o motivo, serializados canonicamente e reduzidos a hash — na versão de esquema rv
  5. De que código QR provém a avaliação (qh); sem QR o campo não existe
  6. Quando foi assinada (iat)

Se alguém alterar mais tarde um único caráter do texto da avaliação, o h deixa de encaixar — e o rh também não. Quem, em vez disso, mexer apenas nos corações deixa o h intacto, mas quebra o rh. Se alguém alterar um destes valores de hash, a assinatura deixa de encaixar. É precisamente esta cadeia que interessa.


3. O que a assinatura deve garantir

Um visitante que lê a avaliação deve poder verificar por si três coisas:

  1. A avaliação foi efetivamente emitida pela McGesund.
  2. O texto não foi alterado desde o envio.
  3. Ninguém pode inventar uma avaliação nova com aparência de válida.

Para isso existe um par de chaves:

  • uma chave privada — encontra-se exclusivamente no serviço de assinatura
  • uma chave pública — pode estar em poder de qualquer pessoa e é endereçada pelo ID da chave (kid) no envelope

Assina-se com a chave privada. Verifica-se com a pública — e isso acontece no navegador do leitor, não no nosso servidor.


4. Porquê sequer um esquema pós-quântico?

Muitos dos esquemas de assinatura hoje habituais assentam na fatorização de números grandes ou em logaritmos discretos. Um computador quântico suficientemente potente poderia resolver exatamente estes problemas muito mais depressa com algoritmos já conhecidos.

Para uma avaliação, isso não é uma questão académica. Uma avaliação deve continuar verificável daqui a dez anos. Quem assina hoje, assina para todo o tempo de vida do registo.

Por isso, o ML-DSA usa outra base:

Problemas de reticulados\boxed{\text{Problemas de reticulados}}

Mais precisamente: Module-LWE e Module-SIS.


5. O que é um reticulado?

Para já, apenas pontos no espaço. Tomemos dois vetores:

b1=(2,0),b2=(1,2).b_1=(2,0), \qquad b_2=(1,2).

Todas as combinações com coeficientes inteiros

ab1+bb2,a,bZa\,b_1+b\,b_2, \qquad a,b\in\mathbb{Z}

formam o reticulado. Por exemplo:

2b1+b2=(4,0)+(1,2)=(5,2).2b_1+b_2 = (4,0)+(1,2) = (5,2).
b₁ = (2,0)b₂ = (1,2)(5,2)0
Dois vetores, todas as combinações inteiras a partir deles: um reticulado. O ponto marcado resulta de duas vezes b₁ e uma vez b₂.

O decisivo:

Em dimensões pequenas, os problemas de reticulados são fáceis. Em dimensões muito altas, determinadas tarefas tornam-se extremamente difíceis.


6. Polinómios em vez de números isolados

O ML-DSA não calcula com vetores em 2D, mas com polinómios e vetores de polinómios.

Um polinómio como

a(x)=1+2x+x3a(x)=1+2x+x^3

pode escrever-se como lista de coeficientes:

a=(1,2,0,1).a=(1,2,0,1).

Calcula-se num anel:

Rq=Zq[x]/(xn+1).R_q=\mathbb{Z}_q[x]/(x^n+1).

Isso significa duas coisas:

  • Zq\mathbb{Z}_q: calcular módulo qq
  • xn=1x^n=-1: uma regra adicional que fixa o comprimento dos polinómios

Para os três níveis do ML-DSA vale:

n=256,q=8380417.n=256, \qquad q=8380417.

Um polinómio tem, portanto, 256 coeficientes, considerados módulo 8 380 417. O que muda entre os níveis não é nn nem qq, mas o tamanho das matrizes — mais sobre isso adiante.

A propósito: na prática, a multiplicação de polinómios neste anel corre através da NTT, a variante da teoria dos números da transformada rápida de Fourier. O ML-DSA está, portanto, longe de dispensar as ideias da FFT; elas estão apenas na aritmética em vez de estarem no princípio da assinatura.


7. O truque central: Module-LWE

A ideia de base é Module Learning With Errors:

t=As1+s2(modq).\mathbf{t}=\mathbf{A}\mathbf{s}_1+\mathbf{s}_2 \pmod q.

Em que:

  • A\mathbf{A} — matriz pública de polinómios, aparentemente aleatória
  • s1,s2\mathbf{s}_1,\mathbf{s}_2 — vetores secretos pequenos
  • t\mathbf{t} — valor público

Um atacante conhece A\mathbf{A} e t\mathbf{t}, mas não s1,s2\mathbf{s}_1,\mathbf{s}_2. Para ele, a equação parece uma equação aleatória com ruído. Não deve conseguir extrair dela os pequenos segredos de forma eficiente.


8. Um exemplo numérico minúsculo

Tomamos de propósito uma variante ridiculamente pequena — números normais em vez de polinómios, dimensão 2 em vez de 256, e

q=17.q=17.

Seja

A=(3572),s1=(11),s2=(10).A=\begin{pmatrix}3&5\\7&2\end{pmatrix}, \qquad \mathbf{s}_1=\begin{pmatrix}1\\-1\end{pmatrix}, \qquad \mathbf{s}_2=\begin{pmatrix}1\\0\end{pmatrix}.

Então:

As1=(3572)=(25),A\mathbf{s}_1=\begin{pmatrix}3-5\\7-2\end{pmatrix}=\begin{pmatrix}-2\\5\end{pmatrix},
t=As1+s2=(25)+(10)=(15)    (165)(mod17).\mathbf{t}=A\mathbf{s}_1+\mathbf{s}_2=\begin{pmatrix}-2\\5\end{pmatrix}+\begin{pmatrix}1\\0\end{pmatrix}=\begin{pmatrix}-1\\5\end{pmatrix} \;\equiv\; \boxed{\begin{pmatrix}16\\5\end{pmatrix}} \pmod{17}.

Neste miniformato seria possível experimentar todas as possibilidades. No ML-DSA-87, A\mathbf{A} é uma matriz 8×78\times 7 de polinómios com 256 coeficientes cada — são mais de 14 000 incógnitas na estrutura do reticulado.


9. O par de chaves do serviço de assinatura

A chave privada contém, entre outras coisas, os pequenos vetores s1,s2\mathbf{s}_1,\mathbf{s}_2. No ML-DSA-87, os seus coeficientes provêm do intervalo

[η,η]comη=2,[-\eta,\eta] \quad\text{com}\quad \eta=2,

ou seja, de {2,1,0,1,2}\{-2,-1,0,1,2\}. Esta pequenez não é um pormenor, é o núcleo: só porque os segredos são pequenos é que surge sequer um problema de reticulados difícil.

A chave pública é, de forma simplificada,

(ρ,t1).(\rho,\mathbf{t}_1).

ρ\rho é uma seed a partir da qual A\mathbf{A} se reconstrói deterministicamente — a matriz não precisa, portanto, de ser transmitida. t1\mathbf{t}_1 são os bits superiores de t\mathbf{t}; os d=13d=13 bits inferiores ficam de fora, o que reduz consideravelmente a chave. Esta omissão é, mais adiante, a razão para os chamados hints.

Assim nasce a assimetria pretendida:

verificar publicamente    assinar em segredo\boxed{\text{verificar publicamente}\;\neq\;\text{assinar em segredo}}

10. A avaliação transforma-se num número

O serviço de assinatura começa por reduzir a hash o objeto do payload da secção 2:

μ=H(m).\mu=H(m).

No nosso exemplo de brincar tomamos um mini-hash artificial. No sistema real, μ\mu tem 512 bits e inclui adicionalmente a chave pública — o que impede que uma assinatura seja reinterpretada como pertencendo a outra chave.


11. Compromisso

O serviço de assinatura sorteia um vetor pequeno aleatório y\mathbf{y}. No nosso exemplo:

y=(21).\mathbf{y}=\begin{pmatrix}2\\-1\end{pmatrix}.

Daí resulta um valor intermédio, o compromisso:

w=Ay=(32+5(1)72+2(1))=(112).\mathbf{w}=A\mathbf{y} =\begin{pmatrix}3\cdot2+5\cdot(-1)\\7\cdot2+2\cdot(-1)\end{pmatrix} =\begin{pmatrix}1\\12\end{pmatrix}.

Isto ainda não é uma assinatura.


12. Da avaliação nasce um desafio

A mensagem e o compromisso são reduzidos a hash em conjunto:

c=H(μ,w).c=H(\mu,\mathbf{w}).

No ML-DSA-87, cc é um polinómio com exatamente τ=60\tau=60 coeficientes de {1,+1}\{-1,+1\}; os restantes 196 são zero. Esta estrutura é intencional: mantém cs1c\cdot\mathbf{s}_1 pequeno.

No nosso exemplo de brincar, pomos simplesmente

c=2.c=2.

13. A assinatura propriamente dita

z=y+cs1.\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1.

Com os nossos valores:

cs1=2(11)=(22),c\,\mathbf{s}_1=2\begin{pmatrix}1\\-1\end{pmatrix}=\begin{pmatrix}2\\-2\end{pmatrix},
z=(21)+(22)=(43)\mathbf{z}=\begin{pmatrix}2\\-1\end{pmatrix}+\begin{pmatrix}2\\-2\end{pmatrix} =\boxed{\begin{pmatrix}4\\-3\end{pmatrix}}

14. O passo que facilmente escapa: rejection sampling

Aqui está o ponto em que o ML-DSA se distingue de uma construção ingénua — e não é opcional.

z=y+cs1\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1 contém o segredo s1\mathbf{s}_1. Se z\mathbf{z} fosse simplesmente divulgado sempre, seria possível extrair estatisticamente s1\mathbf{s}_1 a partir de um número suficiente de assinaturas. Num portal de avaliações com muitíssimas assinaturas por dia, isso não é um risco teórico.

Por isso, o serviço de assinatura verifica antes da emissão se z\mathbf{z} revela demasiado e, em caso afirmativo, descarta a assinatura — recomeçando então do princípio com um novo y\mathbf{y} aleatório. Chama-se a isto Fiat-Shamir with Aborts.

A condição é, no essencial:

z<γ1β.\|\mathbf{z}\|_\infty < \gamma_1-\beta.
Compromisso w = AyDesafio c = H(μ, w)Resposta z = y + c · s₁‖z‖∞ < γ₁ − β ?sima assinatura é emitidanão — novo y
Três passos e um ciclo. Se z sair demasiado grande, não se corrige — descarta-se toda a passagem e recomeça-se com um y aleatório novo. É por isso que assinar é aqui um processo iterativo.

Para o ML-DSA-87 vale γ1=219\gamma_1=2^{19} e β=τη=602=120\beta=\tau\cdot\eta=60\cdot2=120. A isso acresce um segundo limiar sobre os bits inferiores. Na prática, várias passagens são normais — assinar é, portanto, um processo iterativo e não um passo único.

Para a verificação é importante o seguinte: é exatamente este limiar que o navegador confere mais tarde. Uma assinatura com coeficientes demasiado grandes é rejeitada, mesmo que a equação feche.


15. Porque é que o navegador consegue verificar isto

O navegador do leitor conhece:

  • a avaliação e, com ela, mm
  • a chave pública (ρ,t1)(\rho,\mathbf{t}_1)
  • a assinatura (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h})

Não conhece s1\mathbf{s}_1. A relação que, ainda assim, o faz avançar:

z=y+cs1Az=Ay+cAs1.\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1 \quad\Longrightarrow\quad A\mathbf{z}=A\mathbf{y}+c\,A\mathbf{s}_1.

E, uma vez que

t=As1+s2\mathbf{t}=A\mathbf{s}_1+\mathbf{s}_2

se verifica, o desconhecido As1A\mathbf{s}_1 pode ser substituído pelo valor público:

Azct=Aycs2.A\mathbf{z}-c\,\mathbf{t}=A\mathbf{y}-c\,\mathbf{s}_2.

Esta é a equação central — e diz algo importante: o navegador não reconstrói AyA\mathbf{y} exatamente, mas apenas a menos do pequeno termo cs2c\,\mathbf{s}_2.


16. O pequeno exemplo até ao fim

Tínhamos:

A=(3572),t=(15),c=2,z=(43).A=\begin{pmatrix}3&5\\7&2\end{pmatrix},\quad \mathbf{t}=\begin{pmatrix}-1\\5\end{pmatrix},\quad c=2,\quad \mathbf{z}=\begin{pmatrix}4\\-3\end{pmatrix}.

Façamos as contas:

Az=(1215286)=(322),ct=2(15)=(210),A\mathbf{z}=\begin{pmatrix}12-15\\28-6\end{pmatrix}=\begin{pmatrix}-3\\22\end{pmatrix}, \qquad c\,\mathbf{t}=2\begin{pmatrix}-1\\5\end{pmatrix}=\begin{pmatrix}-2\\10\end{pmatrix},
Azct=(112).A\mathbf{z}-c\,\mathbf{t}=\begin{pmatrix}-1\\12\end{pmatrix}.

O compromisso original era

w=(112).\mathbf{w}=\begin{pmatrix}1\\12\end{pmatrix}.

A diferença é

(112)(112)=(20)=cs2.\begin{pmatrix}-1\\12\end{pmatrix}-\begin{pmatrix}1\\12\end{pmatrix} =\begin{pmatrix}-2\\0\end{pmatrix} =-c\,\mathbf{s}_2.

Ou seja, exatamente o pequeno termo de erro previsto. O verificador não recebe w\mathbf{w}, mas algo que fica perto de w\mathbf{w}.

É precisamente por isso que o ML-DSA não compara os valores em si, mas os seus bits superiores. E é precisamente por isso que a assinatura contém adicionalmente um vetor de hints h\mathbf{h}: indica de forma compacta em que posições o arredondamento saltou uma fronteira por causa do pequeno termo de erro. No ML-DSA-87 são permitidos no máximo ω=75\omega=75 desses indícios. Eles não revelam o segredo — apenas reparam o arredondamento.

No fim, o navegador recalcula o desafio. Se coincidir,

cnovo=c,c_{\text{novo}}=c,

e se todas as normas estiverem dentro dos limiares, a assinatura é válida.


17. O que acontece se alguém alterar a avaliação?

Suponhamos que alguém com acesso à base de dados — incluindo alguém da nossa equipa — altera o texto da avaliação ou um dos corações. Então muda pelo menos um dos dois valores de hash no payload (h no caso do texto, rh no caso de qualquer campo do registo):

H(m)H(m).H(m)\neq H(m').

Com isso muda o desafio:

cc.c\neq c'.

Mas a assinatura existente foi gerada para o desafio antigo. O navegador refaz as contas e conclui:

cnovocassinaturaAssinatura invaˊlidac_{\text{novo}}\neq c_{\text{assinatura}} \quad\Longrightarrow\quad \boxed{\text{Assinatura inválida}}

A frase decisiva é esta: podemos apagar uma avaliação, mas não podemos alterá-la sem que se note. Na McGesund, a mesma verificação corre ainda todas as noites do lado do servidor sobre o acervo — uma avaliação que não passe nessa verificação deixa de contar para a média da empresa.


18. Porque é que ninguém pode inventar uma assinatura?

Um atacante conhece A\mathbf{A} e t\mathbf{t}, mas não s1,s2\mathbf{s}_1,\mathbf{s}_2. Para construir uma assinatura válida, teria de encontrar um trio (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h}) que

  • satisfaça a equação de verificação e
  • respeite os limiares de norma e
  • corresponda ao desafio que resulta exatamente destes mesmos valores.

No essencial, isso conduz a um problema de reticulados difícil — em concreto, ao Module-SIS: encontrar soluções curtas de uma equação homogénea módulo qq. A condição de pequenez não é aqui um acessório, é o verdadeiro grau de dificuldade. Sem ela, uma solução seria trivial.

dados puˊblicos    problema de reticulados difıˊcil\boxed{\text{dados públicos}\;\rightarrow\;\text{problema de reticulados difícil}}

19. Porquê «module»?

A palavra descreve a estrutura situada entre vetores simples e reticulados gerais. Em vez de calcular com números isolados, o ML-DSA trabalha com vetores de polinómios:

a=(a1(x),a2(x),,ak(x)),\mathbf{a}=(a_1(x),a_2(x),\ldots,a_k(x)),

e com matrizes formadas por eles:

A=(a1,1(x)a1,2(x)a2,1(x)a2,2(x)).\mathbf{A}= \begin{pmatrix} a_{1,1}(x)&a_{1,2}(x)&\cdots\\ a_{2,1}(x)&a_{2,2}(x)&\cdots\\ \vdots&\vdots&\ddots \end{pmatrix}.

A vantagem: obtém-se a alta dimensão de um reticulado, mas mantém-se uma representação compacta e eficientemente calculável. A segurança pode ser afinada através do tamanho da matriz, sem mudar de anel.


20. Porquê precisamente 87?

Os três níveis não se distinguem no anel, mas nas dimensões:

ParâmetroML-DSA-44ML-DSA-65ML-DSA-87
Tamanho da matriz (k,)(k,\ell)4×44\times46×56\times58×78\times7
Intervalo do segredo η\eta242
Peso do desafio τ\tau394960
Chave pública1 312 B1 952 B2 592 B
Assinatura2 420 B3 309 B4 627 B
Categoria NIST235

Digno de nota: o ML-DSA-87 não é simplesmente «o ML-DSA-65, só que maior». O intervalo do segredo η\eta volta de 4 para 2; aqui a segurança vem da matriz maior, não de coeficientes maiores. Trata-se de uma escolha de parâmetros autónoma e normalizada.

estrutura matemaˊtica maiormargem de seguranc¸a maior\boxed{\text{estrutura matemática maior}\rightarrow\text{margem de segurança maior}}

O preço: 4 627 bytes por assinatura — por cada carimbo que é armazenado e entregue ao navegador no momento da verificação. Por isso, na McGesund, ao lado do ML-DSA-87 existe também o FALCON à escolha, que se basta com 1 280 bytes.


21. Fiat-Shamir: porque funciona sem interlocutor

Uma prova interativa decorreria assim:

  1. O serviço de assinatura envia um compromisso.
  2. O verificador envia um desafio aleatório.
  3. O serviço de assinatura responde.
  4. O verificador refaz as contas.

No caso de uma avaliação, esse diálogo não existe — o leitor chega meses mais tarde. A solução é a transformação de Fiat-Shamir: o desafio não é sorteado, mas obtido por hash a partir dos próprios dados:

c=H(chave puˊblica,  mensagem,  compromisso).c=H(\text{chave pública},\;\text{mensagem},\;\text{compromisso}).

Assim, um diálogo transforma-se num documento. O serviço de assinatura não pode escolher o desafio, porque para isso teria de controlar o hash.


22. Todo o processo

SERVIÇO DE ASSINATURA (MCGESUND)NAVEGADOR DO VISITANTEchave privada s₁, s₂Payload m = {Empresa, Avaliação, h, rh, iat}Hash μvetor aleatório yCompromisso w = AyDesafio c = H(μ, w)z = y + c · s₁Assinatura (c, z, hints) + kidAvaliação + assinatura + chave públicaAz − c·t → bits superiores + hintsrecalcular o desafiodesafio recalculado = desafio fornecido?válidainválidadescartar se z for demasiado grande(rejection sampling)
Todo o percurso de uma avaliação. O retorno a tracejado é o rejection sampling — é percorrido tantas vezes quantas forem necessárias até z ser suficientemente pequeno para nada revelar sobre a chave secreta.

23. O que a McGesund faz concretamente com isto

Três níveis encaixam uns nos outros:

O envelope. Cada avaliação assinada leva uma assinatura Ed25519. Essa é a variante obrigatória — clássica, minúscula, verificável nativamente em qualquer navegador.

Os carimbos pós-quânticos. Adicionalmente, podem ser colocadas ao lado uma ou duas assinaturas resistentes a computadores quânticos. Quais, depende do plano:

Planoníveis de assinatura disponíveis
BasisEd25519, FN-DSA-512
KlassikEd25519, FN-DSA-512, FN-DSA-1024
ProEd25519, FN-DSA-1024, ML-DSA-87
PremiumEd25519, FN-DSA-1024, ML-DSA-87, ambas em paralelo

A variante paralela é deliberadamente redundante. Se uma das duas famílias matemáticas — reticulados NTRU no FALCON, reticulados de módulo no ML-DSA — vier a revelar-se mais fraca do que hoje se admite, a outra continua a sustentar.

A âncora temporal. A impressão digital da chave de assinatura é ancorada num bloco da Bitcoin através do OpenTimestamps. Com isso, não se demonstra apenas que a assinatura é autêntica, mas também que já existia num determinado momento — sem que ninguém tenha de acreditar no nosso carimbo temporal.

Tudo isto é verificado no navegador do leitor, através de um módulo WASM. Nós fornecemos os dados; as contas são refeitas no aparelho do visitante. Se amanhã saíssemos da rede, uma avaliação já descarregada continuaria verificável.


24. ML-DSA e FALCON lado a lado

PropriedadeFALCON (FN-DSA)ML-DSA
Tipoassinatura digitalassinatura digital
Família de reticuladosNTRUModule-LWE / Module-SIS
AnelZq[x]/(xn+1)\mathbb{Z}_q[x]/(x^n+1), q=12289q=12289Zq[x]/(x256+1)\mathbb{Z}_q[x]/(x^{256}+1), q=8380417q=8380417
Mecanismo centralvetor curto por amostragem gaussianadesafio-resposta com abortos
FFT / NTTFFT de vírgula flutuante, crítica para a segurançaNTT, apenas aritmética
Tamanho da assinatura (nível mais alto)1 280 B4 627 B
Implementaçãoexigente (vírgula flutuante)comparativamente direta
Normalizaçãoprevista como FIPS 206 (FN-DSA), ainda não concluídaFIPS 204, concluída

Em resumo: o ML-DSA é mais fácil de implementar e verificar corretamente, o FALCON fornece assinaturas bastante mais compactas. No código QR não está nenhuma das duas — ali fica apenas o envelope Ed25519. Por isso, o tamanho da assinatura conta no armazenamento e na entrega, e a robustez conta na implementação. É por isso que oferecemos ambas.


25. Uma frase para levar

O ML-DSA gera, a partir de um vetor secreto curto, uma resposta a umdesafio obtido por hash da proˊpria avaliac¸a˜o — verificaˊvelpor qualquer pessoa com a chave puˊblica.\boxed{ \begin{array}{c} \text{O ML-DSA gera, a partir de um vetor secreto curto, uma resposta a um}\\ \text{desafio obtido por hash da própria avaliação — verificável}\\ \text{por qualquer pessoa com a chave pública.} \end{array}}

Quem possui o vetor secreto assina em milissegundos. Quem não o possui teria de resolver um problema de reticulados em mais de 14 000 dimensões — mesmo com um computador quântico.

Para o leitor de uma avaliação, isso significa simplesmente: não tem de acreditar em nós. Pode verificar por si.