密码学小知识

其实还想写一点计算理论小知识的,但好像密码学越写越不明白了。本文人物均为虚构。

假设 W 有两张无向图 \(G_0,G_1\),B 声称自己知道两张图同构,W 要求 B 证明这件事情,B 希望证明是零知识的。

考虑在给出映射的情况下可以简单验证图同构。B 随机一个置换应用到 \(G_1\) 上,得到一张与两者都同构的图 \(H\),W 可以要求:

  • 检查 \(G_1\)\(H\),此时 \(B\) 展示置换。
  • 检查 \(G_0\)\(H\),此时 \(B\) 展示置换和 \(G_0\to G_1\) 的复合。

这是零知识的,每次验证正确率为 \(\frac12\)

B 声称自己知道两张图不同构,需要给出零知识证明。

零知识证明中,我们通常假设证明者是全能的,使得保证证明在逻辑上正确。W 随机选择 \(G_0\)\(G_1\) 中的某个,随机一个置换后给出,B 需要回答新图和哪张图同构。这依然是零知识的,每次验证正确率为 \(\frac12\)

上面的两个过程都是交互式证明,更常用的是非交互式证明。具体来说对于给定的零知识证明方式,使用单向的哈希方式充当随机验证,这样只需保证初始哈希的设置永远可靠即可。

这即为 zk-SNARKs 的核心理论,zk-STARKs 可以做到无需初始的信任设置。众所周知计算机的布尔逻辑和代数运算等价,因此可以将验证过程改写为一个多项式,证明者出示这个多项式,验证者随机检查上面的几个点。但显然的漏洞是,验证者可以通过查询若干特殊点值,来获得知识。有一种非常神奇的做法,可以不告诉验证者这个多项式是什么,方法如下:

  • 设多项式为 \(P(x)\),随机生成特定点 \(s\),计算 \(P(s)\)
  • 验证者给出查询的位置 \(\lambda\),设 \(P(\lambda)=y\),根据因式定理,存在 \(Q(x)=\frac{P(x)-y}{x-\lambda}\),证明者计算 \(Q(x)\),给出 \(y\)\(Q(s)\)
  • 验证者检查等式。

不过依然有很多漏洞,比如验证者可以将 \(Q(x)\) 插值插出来。为了避免这种情形,证明者随机噪音多项式 \(B(x)\),以及构造一个辅助多项式 \(R(x)\),使用多项式 \(P(x)+R(x)B(x)\) 进行证明,这样肯定就没法插出来了,这称作盲化。\(R(x)\) 的作用是保证所有计算点真实,也就是那些比较关键的、询问之后可能获得知识的点。当然随机也不能乱随,需要保证查询可以满足某种线性关系,而计算点真实,保证了不是随便编出来一个满足线性关系的多项式。后面不太懂啊,为啥这样就全对了?

posted @ 2026-01-28 22:27  BYR_KKK  阅读(18)  评论(2)    收藏  举报