环签名原理详解

环签名原理详解

预备阶段

​ 假设签名者拥有某私钥 sk 和公钥 pk,其中 pk = sk·g,这里 g 是 椭圆曲线上的 基点(base point),也被称为生成元(generator)。而 “ · ” 这里是倍乘,sk · g 表示 sk 个 g 点在椭圆曲线上进行加法运算。

​ 首先定义一个 hash 函数,这个 hash 函数的输入是 待签名的消息 m 和 椭圆曲线上的一个点 A,即 Hash(m, A)。该 hash 函数和椭圆曲线一样,是这个签名和验签体系的前提。

第一步:

​ 签名方想对一消息 m 进行签名,但是又不想在公开签名的同时,让别人知道自己的确切身份,因此 签名方 决定用环签名的方式将自己藏到一群人中。于是 签名方 找来 n-1 个其他人的公钥(这些公钥最好之前在系统中已经出现过和使用过,不然 签名方 藏在一堆新人中,还是会很容易的被识别出来),并编好序号,并将自己的公钥随机地插入其中,共同组合了一个包含 n 个公钥的集合。

首先,假设这 n 个公钥为 p k 0 pk_{0} pk0, p k 1 pk_{1} pk1, p k 2 pk_{2} pk2, …, p k i − 1 pk_{i-1} pki1, p k i pk_{i} pki, p k i + 1 pk_{i+1} pki+1, …, p k n pk_{n} pkn

其中 p k i pk_{i} pki为签名方的公钥。

然后,签名方随机生成 n-1 个随机数 S 0 S_{0} S0, S 1 S_{1} S1, …, S i − 1 S_{i-1} Si1, S i + 1 S_{i+1} Si+1, …, S i + 1 S_{i+1} Si+1,分别与 n-1 个公钥 一 一 对应,这一步没有生成 S i S_{i} Si,因为 S i S_{i} Si 会在后面通过计算得到 。

第二步:

签名方随机生成 k , 并计算 k · g , 这里我们先假设

k · g = S i S_{i} Si · g + C i C_{i} Ci · p k i pk_{i} pki(等式①)

这里 等式① 的用途暂时可能不太好理解,但可先不用管。但根据 等式① 我们可以确定的是,如果拥有 p k i pk_{i} pki 的私钥 s k i sk_{i} ski,且如果已知 C i C_{i} Ci 和 k ,那就可以反向求出 S i S_{i} Si

注意:这里的 C i C_{i} Ci 是根据上一个公钥 p k i − 1 pk_{i-1} pki1 和消息 m 计算出的 hash 值

接下来引入第2个式子

C i C_{i} Ci = Hash(m, S i − 1 S_{i-1} Si1 · g + C i − 1 C_{i-1} Ci1 · p k i − 1 pk_{i-1} pki1) (等式②)

等式② 是一个递推式,且 Hash 函数的第二个参数形式上跟 等式① 的右侧是一样的。这个递推式的意思是:已知第 i − 1 i-1 i1 个公钥对应的 S i − 1 S_{i-1} Si1 和 hash 值 C i − 1 C_{i-1} Ci1,求下一个公钥对应的 hash 值 C i C_{i} Ci。注意,当 i i i = 0 时, i i i 的上一个其实是 n-1,因为下标也要对 n 取模。

由于在 等式① 中我们定义了 k · g = S i S_{i} Si · g + C i C_{i} Ci · p k i pk_{i} pki 所以 C i + 1 C_{i+1} Ci+1 可直接由计算得到

C i + 1 C_{i+1} Ci+1 = Hash(m , S i S_{i} Si · g + C i C_{i} Ci · p k i pk_{i} pki) = Hash( m , k · g)

此时求 C i + 1 C_{i+1} Ci+1 过程中我们暂时并不知道 S i S_{i} Si C i C_{i} Ci,但后面计算得到 C i C_{i} Ci 后,可以由 k, C i + 1 C_{i+1} Ci+1 C i C_{i} Ci 求出 S i S_{i} Si

第三步:

紧接着,依次计算 C i + 2 C_{i+2} Ci+2 , …… , C n − 1 C_{n-1} Cn1, C 0 C_{0} C0,…, C i − 1 C_{i-1} Ci1 , C i C_{i} Ci

C i + 2 C_{i+2} Ci+2 = Hash(m, S i + 1 S_{i+1} Si+1 · g + C i + 1 C_{i+1} Ci+1 · p k i + 1 pk_{i+1} pki+1)

……

C n − 1 C_{n-1} Cn1 = Hash(m, S n − 2 S_{n-2} Sn2 · g + C n − 2 C_{n-2} Cn2 · p k n − 2 pk_{n-2} pkn2)

C 0 C_{0} C0 = Hash(m, S n − 1 S_{n-1} Sn1 · g + C n − 1 C_{n-1} Cn1 · p k n − 1 pk_{n-1} pkn1)

C 1 C_{1} C1 = Hash(m, S 0 S_{0} S0 · g + C 0 C_{0} C0 · p k 0 pk_{0} pk0)

……

C i C_{i} Ci= Hash(m, S i − 1 S_{i-1} Si1 · g + C i − 1 C_{i-1} Ci1 · p k i − 1 pk_{i-1} pki1)

以上为 计算 C i + 2 C_{i+2} Ci+2, … , C n − 1 C_{n-1} Cn1, C 0 C_{0} C0, …, C i − 1 C_{i-1} Ci1, C i C_{i} Ci 过程

有了 C i C_{i} Ci之后,回头观察等式① ,由于 p k i pk_{i} pki 的私钥是已知的,即

p k i pk_{i} pki = s k i sk_{i} ski · g

因此 等式① 可写成

k · g = S i S_{i} Si · g + C i C_{i} Ci * s k i sk_{i} ski · g

两边约去 g,变为

k = S i S_{i} Si + C i C_{i} Ci * s k i sk_{i} ski

从而根据 k, C i C_{i} Ci s k i sk_{i} ski 可以求出 S i S_{i} Si ,即

S i S_{i} Si= k - C i C_{i} Ci * s k i sk_{i} ski

注意:私钥 s k i sk_{i} ski 在这里发挥了作用,如果没有 s k i sk_{i} ski S i S_{i} Si也无法求出。

第四步:

S i S_{i} Si 一旦求出后,环签名的环就形成了。而且此时 k 值的使命也已完成,可以被抛弃掉了。

换句话说,正因为我们拥有私钥 s k i sk_{i} ski, 所以可以构造出一个 S i S_{i} Si,配合随机生成的 S 0 S_{0} S0, S 1 S_{1} S1, …, S i − 1 S_{i-1} Si1, S i + 1 S_{i+1} Si+1, …, S i + 1 S_{i+1} Si+1,使得以下式子都成立:

C 0 C_{0} C0 = Hash(m, S n − 1 S_{n-1} Sn1 · g + C n − 1 C_{n-1} Cn1 · p k n − 1 pk_{n-1} pkn1)

C 1 C_{1} C1 = Hash(m, S 0 S_{0} S0 · g + C 0 C_{0} C0 · p k 0 pk_{0} pk0)

C n − 1 C_{n-1} Cn1 = Hash(m, S n − 2 S_{n-2} Sn2 · g + C n − 2 C_{n-2} Cn2 · p k n − 2 pk_{n-2} pkn2)

反之,如果这 n 个公钥中的任何一把私钥,签名者都没有,那么也就无法求出 S i S_{i} Si 使得{ C 0 C_{0} C0, p k 0 pk_{0} pk0, …. p k n − 1 pk_{n-1} pkn1, S 0 S_{0} S0, …., S n − 1 S_{n-1} Sn1}形成一个环。

因此,如果上述 n 个等式成立,那么也有意味着,生成这 n 个等式的人至少拥有这 n 个公钥中一把私钥。

最后消息 m 的环签名数据为:

Signature = { C 0 C_{0} C0, p k 0 pk_{0} pk0, …. p k n − 1 pk_{n-1} pkn1, S 0 S_{0} S0, …., S n − 1 S_{n-1} Sn1}

验证阶段

验证者根据 C 0 C_{0} C0, p k 0 pk_{0} pk0, …. p k n − 1 pk_{n-1} pkn1, S 0 S_{0} S0, …., S n − 1 S_{n-1} Sn1,消息 m 和 等式② 依次求出 C 1 C_{1} C1, C 2 C_{2} C2, C 3 C_{3} C3 ,…., C n − 1 C_{n-1} Cn1最后根据 C n − 1 C_{n-1} Cn1 求出 C 0 ′ C'_{0} C0

并判断 C 0 ′ C'_{0} C0 是否等于 C 0 C_{0} C0

如果相等则签名有效,如果不等则签名无效。

本文整理来自:环签名原理与隐私保护

  • 9
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值