这个题目摘自2018年的论文Post-Quantum Zero-Knowledge Proofs for Accumulators with Applicationsto Ring Signatures from Symmetric-Key Primitives,写了一点理解罢了,看个热闹。
这篇文章考虑只使用对称原语哈希函数和分组密码(也就是不需要格了,需要格的话貌似需要提供结构硬度?),实现具有零知识成员证明和环签名的累加器,同时,这个方案是抗量子的。为了实现证明系统的有效实例化,通过构造电路实现高效的非交互式零知识证明。在构建分组的基础上,展示了如何仅使用对称原语构建对数复杂度的环签名。(使用具有零知识成员证明和环签名的累加器)
环签名:环中的成员使用公钥代表环生成了签名,但是不知道具体是哪个成员签的名。
一般来说,与编码和多元密码学相关的后量子环签名方案,随着成员个数的增加,签名大小是线性的,这篇文章提出的累加器能构造亚线性大小的环签名
PQ累加器和零知识成员证明:完全依赖于非结构化的假设,使用默克尔树作为累加器。
累加器是一个元组,也就是一整套操作(Gen,Eval,WitCreate,Verify),其中,Gen(1^k,t)输入一个安全参数k和一个参数t,这个t其实就是累加元素的上界,返回的元素是sk和pk,认为pk定义了累加域D。Eval((sk, pk), X)输入一个公私钥对和一个集合X进行累积,并返回一个累加器X以及一些辅助信息aux。WitCreate((sk, pk), X, aux, xi)以一个密钥对sk和pk,一个累加器X和辅助信息aux和一个值xi作为输入,如果xi不属于X,那么就返回false,否则返回一个证明witx。Verify(pk, X, witx, xi)输入pk,累加器X,证明witx和xi,如果witx是X中xi的证明,返回true,否则返回false。
![](https://i-blog.csdnimg.cn/blog_migrate/ca2c2406bd88c3f8cbecc57d0cd991b2.png)
具体的实现?第一步其实就是定义哈希函数,这里的哈希函数可以是SHA也可以是SM3,就是生成密钥对。第二步就是先解析,如果n不是2的幂次就返回false(这个n是叶子节点数,必须要是完美的二叉树),如果有,就能继续做,就从第0层开始DFS,到底就返回哈希,这样的话,相比服务器只给一些中间节点会慢,但是服务器并不能知道是谁投了票。这个累加器值就是根节点存的哈希值,aux作为辅助信息,存的是每一行的节点的哈希值。第三步首先解析aux,变成每一行的节点,然后从下往上重构Merkle树,wit的那个函数其实就是给中间节点凑根节点哈希值的过程,虽然证明懒了,但是选择一共八个叶子节点,i=3(xi为第四个叶子节点),v=0时,wit的结果是第三个,v=1时,是倒数第二层第0个,也是刚才选择的两个叶子节点的父节点的兄弟节点,又可以向上构造,可以一直构造到根节点。第四步进行验证,首先把叶子设置成每一方的哈希值,然后从上往下DFS,看存不存在和根节点相等的情况,找到的话就是环中的成员。(这个和根节点比较要防止碰撞,用哈希函数即可)。
这里假设有n个叶子,那么服务器发给用户一个程序,程序里有从每个叶子节点算到根节点所需要的路径,用户算完n个根节点以后,如果有一个值和服务器根节点存储的相等,就认为用户在这个环中。
单向域累加器:几个性质: