文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

比特币 ZK 赏金系列:第 2 部分——查找哈希冲突

2023-10-12 19:17

关注

在我们的零知识赏金 (ZKB) 系列的第二部分中,我们将其应用于解决哈希冲突难题。在这样的谜题中,两个不同的输入散列到相同的输出。此类赏金可用于:

  1. 充当煤矿中的金丝雀,给我们一个有价值的提醒。存在冲突是散列函数较弱的标志,因此我们可以尽早升级以减轻损失。

  2. 资助研究以发现哈希函数中的漏洞,特别是对于 MiMC 等新函数。

碰撞攻击

历史

比特币开发者彼得托德于 2013 年最初发布了用于发现各种哈希函数中的冲突的比特币赏金。SHA1 赏金是在 2017 年收集的,在谷歌破解它后不久。

最初的哈希碰撞赏金

这种原始赏金有两个缺点:

  1. 一旦有人广播包含解决方案的收集交易,矿工就可以拦截它,提取解决方案,并将奖励重定向到他们自己。

  2. 该解决方案是公开的,可以被恶意行为者利用。

ZKB 解决了这两个问题,因此只有发现碰撞的赏金收集者才能赎回它,并且只有赏金制定者才能了解解决方案。

实现

第 1 部分一样,我们只需替换特定于应用程序的电路 C 即可验证两个原像(即散列函数的输入)不同但它们产生相同的散列。我们以 Poseidon 哈希函数为例,一种新的 ZK 友好哈希。其他哈希函数可以使用类似方式。这两个原像作为私有输入传递进来,永远不会公开透露。

template Main() {    // Private inputs:    signal input preimage0[16];     signal input preimage1[16];    signal input db[4];                      // Seller (Bob) private key.    signal input Qs[2][4];                   // Shared (symmetric) key. Used to encrypt w.        // "Public" inputs that are still passed as private to reduce verifier size on chain:    signal input Qa[2][4];                   // Buyer (Alice) public key.    signal input Qb[2][4];                   // Seller (Bob) public key.    signal input nonce;                      // Needed to encrypt/decrypt xy.    signal input ew[34];                     // Encrypted solution to puzzle.    // Public inputs:    signal input Hpub[2];            // Hash of inputs that are supposed to be public.         // As we use SHA256 in this example, we need two field elements         // to acommodate all possible hash values.         Assert that public inputs hash to Hpub. ///    ...     Assert that preimages are a valid solution. //    // Check preimage0 and preimage1 are differend and that they produce the same hash.    var diff = 0;    for (var i = 0; i < 16; i++) {        diff += preimage0[i] ^ preimage1[i];    }    assert(diff != 0);    component h0 = Poseidon(16);    component h1 = Poseidon(16);    for (var i = 0; i < 16; i++) {        h0.inputs[i] <== preimage0[i];        h1.inputs[i] <== preimage1[i];    }    h0.out === h1.out;     Assert that (db * Qa) = Qs     ...     Assert that (db * G) = Qb /    ...     Assert that encrypting w with Qs produces ew. /    ...}

GitHub 上提供了完整的代码和测试,包括验证证明并支付赏金收集者的智能合约

来源地址:https://blog.csdn.net/freedomhero/article/details/133072938

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯