• 使用 zk-SNARKs 的可编程零知识证明:第 3 部分


    之前,我们已经展示了如何使用称为零知识密钥声明证明 (ZKKSP) 的技术为以下声明构建零知识证明 (ZKP)。

    在这里插入图片描述
    基本上,它证明了不仅证明者知道给定公钥的密钥,而且还证明知道给定摘要的秘密哈希,而不会泄露秘密。

    在这里插入图片描述

    图片来自 CoinGeek

    虽然 ZKKSP 有效,但它有一个严重的限制:它只适用于一种特定形式的声明,即秘密是给定公钥的私钥,也是给定哈希的原像。

    目前尚不清楚如何将其扩展为稍作修改的声明,例如,除了作为私钥和原像之外,私钥也是偶数。此外,提出它需要密码学的专利级知识,例如 ∑ 协议和承诺方案。

    使用 zkSNARKs 的 ZKKSP

    我们通过利用 zkSNARKs 的可编程性来重新实现 ZKKSP。我们简单地将第 2 部分中使用的椭圆曲线点乘法和散列库结合起来。生成的 Circom 代码如下所示:

    // library circuits from https://github.com/0xPARC/circom-ecdsa
    include "lib-circom-ecdsa/ecdsa.circom";
    include "../node_modules/circomlib/circuits/sha256/sha256.circom";
    include "../node_modules/circomlib/circuits/bitify.circom";
    
    // `n`: chunk length in bits for a private key
    // `k`: chunk count for a private key
    template Main(n, k) {
      // n * k == 256
      assert(n * k >= 256);
      assert(n * (k-1) < 256);
    
      // little-endian
      signal private input privkey[k];
      signal public input pubkey[2][k];
    
      signal public output privkeyHash[k];
    
      // get pubkey from privkey
      component privToPub = ECDSAPrivToPub(n, k);
      for (var i = 0; i < k; i++) {
        privToPub.privkey[i] <== privkey[i];
      }
    
      // verify input pubkey
      signal pub_x_diff[k];
      signal pub_y_diff[k];
      for (var i = 0; i < k; i++) {
        pub_x_diff[i] <-- privToPub.pubkey[0][i] - pubkey[0][i];
        pub_x_diff[i] === 0;
        pub_y_diff[i] <-- privToPub.pubkey[1][i] - pubkey[1][i];
        pub_y_diff[i] === 0;
      }
    
      // calculate sha256 of privkey
      component sha256 = Sha256(256);
      for (var i = 0; i < k; i++) {
        for (var j =0; j < n; j++) {
          // change privkey to big-endian as sha256 input
          sha256.in[i * n + j] <-- (privkey[k-1-i] >> (n-1-j)) & 1;
        }
      }
    
      // set output
      component b2n[k];
      for (var i = 0; i < k; i++) {
        b2n[i] = Bits2Num(n);
        for(var j = 0; j < n; j++) {
          // `b2n` input is little-endian in bits, `sha256` out is big-endian in bits
          b2n[i].in[n-1-j] <== sha256.out[i * n + j];
        }
        privkeyHash[i] <== b2n[i].out;
      }
    
    }
    
    component main {public [pubkey]} = Main(64, 4);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    key_stmt.circom

    和以前一样,我们在第 15 行使用 ECDSAPrivToPub 从第 14 行的私钥派生出一个公钥(注意它被声明为私有)。然后我们使用第 3 行导入的 sha256 库中的 Sha256 对相同的私钥进行哈希处理,以确保结果与第 17 行的给定哈希匹配。我们刚刚“编程” 实现了 ZKKSP,不需要高级密码学的先验知识。此外,由于 zkSNARKs 的可组合性,我们可以轻松地对其进行扩展以添加对秘密的约束,例如,秘密是偶数。

    可以在这里找到一个测试

  • 相关阅读:
    关于GPU显卡的介绍
    Java版工程行业管理系统源码-专业的工程管理软件- 工程项目各模块及其功能点清单
    【图像分类】2022-ConvMixer ICLR
    “拍视频”成为小程序的基础能力
    【毕业设计】机器视觉行人口罩佩戴检测系统 - python 深度学习
    pandas学习(四) apply
    Cortex-A7 架构
    【2022年高教杯数学建模】C题:古代玻璃制品的成分分析与鉴别方案及代码实现(三)
    PAT 1056 Mice and Rice(模拟比赛,同一轮比赛 多个场次)
    计算机毕设 flink大数据淘宝用户行为数据实时分析与可视化
  • 原文地址:https://blog.csdn.net/freedomhero/article/details/127450863