我对密码学比较陌生,但我编程已经有一段时间了。这里有一个故事很好地解决了我想要解决的问题:
爱丽丝有一本用政府私钥签名的数字护照。每个属性都是单独签名的,并且仍然可以验证,例如,她的名字是"Alice",而没有说她的姓是"Smith“。
从这里,知道她可以证明她的出生日期是05/04/1975,她能证明她超过18岁,同时既没有透露她的生日,也没有向第三方寻求帮助?
我猜她做不到,但我希望你能给我惊喜!
发布于 2021-12-27 15:54:30
使用椭圆曲线:护照可以包含一个unix时间戳,作为Pedersen形式的承诺( C = bG + tH ),其中b是标量盲因子,t是护照持有人的出生日期,是unix时间戳(自那个时代以来的几秒),而G和H是众所周知的基点选择,因此他们之间的离散日志是未知的和不可知的。
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的幂。
https://crypto.stackexchange.com/questions/96232
复制相似问题