首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZKP:证明躲藏年龄>18岁

ZKP:证明躲藏年龄>18岁
EN

Cryptography用户
提问于 2021-11-21 17:30:18
回答 1查看 856关注 0票数 7

我对密码学比较陌生,但我编程已经有一段时间了。这里有一个故事很好地解决了我想要解决的问题:

爱丽丝有一本用政府私钥签名的数字护照。每个属性都是单独签名的,并且仍然可以验证,例如,她的名字是"Alice",而没有说她的姓是"Smith“。

从这里,知道她可以证明她的出生日期是05/04/1975,她能证明她超过18岁,同时既没有透露她的生日,也没有向第三方寻求帮助?

我猜她做不到,但我希望你能给我惊喜!

EN

回答 1

Cryptography用户

发布于 2021-12-27 15:54:30

使用椭圆曲线:护照可以包含一个unix时间戳,作为Pedersen形式的承诺( C = bG + tH ),其中b是标量盲因子,t是护照持有人的出生日期,是unix时间戳(自那个时代以来的几秒),而GH是众所周知的基点选择,因此他们之间的离散日志是未知的和不可知的。

C由政府签署。护照使护照持有人知道时间戳和致盲因素。

为了证明护照持有人年龄大于18岁,我们首先计算出s是护照持有人出生时可能出现的最新的时间戳,目前是18岁或以上。

护照持有人需要证明这是s>=t。我们可以通过证明C' = sH - C == (s-t)H - bG是对一个正数的承诺来做到这一点。由于EC代数的模算术性质,这意味着我们需要确保承诺是相对较小的数,而不是由于s-t是“负数”而产生的庞大数目。

为了达到这个目的,我们需要一个叫做范围证明的东西。

距离证明将证明C'可以由一个43位的序列构造(这将允许该方案在未来200年内工作)。每个“位”要么是零,要么是2的幂。

首先,我们将宣布43个Pedersen承诺C_i用于0到42之间的i值,其中每个承诺都有自己的致盲因子b_i,而每个承诺要么是值为零,要么是2^i

现在,我们需要证明C'是对与\sum_{i=0}^{42} C_i相同的数字的承诺。这可以通过计算公钥C'' = C' - \sum_{i=0}^{42} C_i来实现。由于C'承诺的数字将等于43承诺承诺的数字之和,因此结果将是表单C'' == b'G where b' == -b - \sum_{i=0}^{42} b_i。因此,在C''上使用私钥b'提供签名将证明不存在C''的非零H组件,因为除非H w.r.t的离散日志,否则使用基点G的签名是不可能的。G是已知的( H是专门选择的,因此它是不可知的)。

最后,我们需要证明每个组件C_i要么是对零的承诺,要么是对2^i的承诺。我们通过为两个公钥(C_i - 0H, C_i - 2^iH)的每个承诺提供一个环签名来做到这一点。只有当这两种可能性中的一种产生没有H组件的EC点,从而证明C_i是对0或2^i的承诺时,环签名才是可能的。

总之,我们已经证明了s>=t,因为我们已经证明了sH -C是对一个积极数字的承诺。我们证明了它是一个正数,证明它可以被建立成一个由43位组成的序列,其中每个位要么是零,要么是指定的2的幂。

票数 2
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/96232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档