热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

零知识证明:具有DDH假设的ZKP

Diffie-Hellman 部分我们必须证明我们仍然持有一个秘密 ( 私有 ) 密钥,这是一个非常典型的情况。那我们怎么把 Victor 和 Peggy 绑定到一个证明基础设施中让 Peggy 向



Diffie-Hellman 部分


我们必须证明我们仍然持有一个秘密 ( 私有 ) 密钥,这是一个非常典型的情况。那我们怎么把 Victor 和 Peggy 绑定到一个证明基础设施中让 Peggy 向 Victor 证明她还持有一把私钥呢?为此,我们将通过交换 Diffie-Hellman 密钥来绑定 Victor 和 Peggy。


在 DDH 中,我们有一个由 ⟨ gg^ag^bg^{ab }⟩ 组成的元组,其中 a 和 b 是秘密。g^a 和 g^b 的值在双方交换后,应该都能生成 g^{ab}:



Chaum-Pedersen 部分


如果 Peggy 是证明者,而 Victor 是验证者,那么 Peggy 需要表明她知道一个秘密值 a。有了 Chaum-Pedersen ZKP,Victor 让 Peggy 生成一个 ZKP 来保护一个秘密。在这个过程中,她将 g^a (mod p) 的值发送给 Victor,当 Victor 需要证明她仍然知道一个值时,他将发送一个挑战值 (s),然后 Alice 生成一个随机值 (r),并返回 y_1=g^r 和 y_2=B^r。然后 Victor 检查 gz=A^s y_1 (mod p) 和 B^z=C^s y_2 (mod p) 是否相等。



在 Victor 和 Peggy 交换他们的秘密后,Victor 将持有 g^a (mod p), Peggy 将持有 g^b(mod p)。对于零知识证明,我们这样开始:


 

Peggy 有一个秘密值a并生成A = g^a。Victor 的秘密值为b并生成B = g^b。他们交换AB,然后使用 Diffie Hellman 方法生成C


Victor 向 Peggy 发送一个 commitment:



Peggy 计算出一个随机值 (r):



她发给 Victor:



 

和:



Peggy 还发送:



Victor 会检查:



和:



如果这些都是真的,那么 Peggy 已经证明她知道这个秘密 (a)。因为:



代码


代码如下所示:


import randomimport libnumimport sys
bitsize=128if (len(sys.argv)>1): bitsize=int(sys.argv[1]) p=libnum.generate_prime(bitsize)s=random.getrandbits(bitsize)g=2a=random.getrandbits(bitsize)b=random.getrandbits(bitsize)c=random.getrandbits(bitsize)
r=random.getrandbits(bitsize)A=pow(g,a,p)B=pow(g,b,p)C=pow(g,a*b,p)
y1=pow(g,r,p)y2=pow(B,r,p)
z=(r+a*s) % (p-1)

print("== Chaum-Pederson ZKP with DDH ==")print("p=",p)print("a=",a)print("A=g^a (mod p)=",A)print("b=",b)print("B=g^a (mod p)=",B)print("ab=",a*b)print("C=g^{ab} (mod p)=",C)

print("\nProof: g^z = A^s y1")val1= pow(g,z,p)val2=(pow(A,s,p)*y1) % pprint("Val1=",val1)print("Val2=",val2)
if (val1==val2): print("- Proof verified") print("\nProof: B^z = C^s y2")val3= pow(B,z,p)val4=(pow(C,s,p)*y2) % p
print("Val3=",val3)print("Val4=",val4)
if (val3==val4): print("- Proof verified")


256 位素数的运行示例如下:


== Chaum-Pederson ZKP ==p= 71808837207067558396943502247178805470599306337269585872075038503116361400603a= 36623398984913964172485596625205226031763309121917034188846578869320021978402A=g^a= 32096207796582799691444233880948982714496908564580085529419678203181985482397b= 31626404664308059618102781249870451013488637545242770934698960204990436278054B=g^a= 22868249499514124460303251323889043821880224466294750444534923941031732565838ab= 1158266436479298052448345755868228483694002563526288816181771624565721107667448582344993414115064433575649547672009235534272667805336831732117954454589708C=g^{ab}= 8021151953795073005899136029637476282156155200732630284950825682466003109726Proof: g^z = A^s y1Val1= 9590670516289397297344719778854690756344241363231213529959870845950311348445Val2= 9590670516289397297344719778854690756344241363231213529959870845950311348445
- Proof verifiedProof: B^z = C^s y2Val3= 56336209634019548929170814618015392124101293159018455662661735618180853220223Val4= 56336209634019548929170814618015392124101293159018455662661735618180853220223
- Proof verified


结论


网络安全的唯一方向是零信任模式。阻止敏感信息数据泄露的一种方法不是储存这些秘密,而是用随机的预言机代替它们。即便这些预言机被泄漏,真正的秘密也不会被泄漏。在我概述的方法中,我们可以通过散列使用证明的生成值轻松地将其转换为 NI-ZKP(非交互式 ZKP)。


Source:https://medium.com/asecuritysite-when-bob-met-alice/hellman-pedersen-and-chaum-zkps-with-the-decisional-diffie-hellman-ddh-assumption-4ed7d4a3220d


关于


ChinaDeFi - ChinaDeFi.com 是一个研究驱动的 DeFi 创新组织,同时我们也是区块链开发团队。每天从全球超过 500 个优质信息源的近 900 篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。


Layer 2 道友 - 欢迎对 Layer 2 感兴趣的区块链技术爱好者、研究分析人与 Gavin(微信: chinadefi)联系,共同探讨 Layer 2 带来的落地机遇。敬请关注我们的微信公众号 “去中心化金融社区”





推荐阅读
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Givenasinglylinkedlist,returnarandomnode'svaluefromthelinkedlist.Eachnodemusthavethe s ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
author-avatar
穿靴子的猫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有