Skip to content

Intro to Ring Signature ​

基于RSA的方案描述 ​

1. 核心数学构件 ​

在 RSA 环签名方案中,我们需要定义三个关键的数学组件:

A. 陷门单向置换 ​

对于环中的每个用户 i,我们使用 RSA 公钥 (ei,ni) 定义一个陷门单向置换 gi。 对于输入 x∈Zni,定义为:

gi(x)=xei(modni)

其逆运算(只有拥有私钥 di 的人才能计算)为:

gi−1(y)=ydi(modni)

注意:为了统一不同用户的模数 ni,我们可以引入公共的大整数 b,使得 2b>max(ni),将运算域统一映射到 [0,2b) 区间。

B. 带密钥的组合函数 ​

这是环签名的灵魂。我们需要一个函数 Ck,v(y1,y2,…,yr),它满足两个关键性质:

  1. 环状结构: 输入是环中每个成员的输出值 yi。
  2. 可逆性: 给定密钥 k、初始值 v 和除 ys 以外的所有 yi,可以高效地解出 ys。

Rivest 提出的构造是基于对称加密(如 AES 或 SHACAL)的加密链:

Ck,v(y1,…,yr)=Ek(yr⊕Ek(yr−1⊕⋯⊕Ek(y1⊕v)…))

其中:

  • k 是密钥(通常由消息 m 的哈希生成,即 k=h(m))。
  • v 是随机初始向量(IV)。(这里可以联想到分组密码的CBC模式)
  • Ek 是对称加密算法。
  • ⊕ 是异或运算。

C. 环方程 ​

签名的目标是找到一组值 y1,…,yr,使得组合函数的输出等于初始值 v:

Ck,v(y1,y2,…,yr)=v

2. 签名算法 ​

假设签名者是环中的第 s 个用户,拥有私钥 ds。环成员公钥集合为 L={pk1,…,pkr}。(pk既加密用的e)

步骤 1:生成密钥与随机数

  • 计算对称密钥 k=h(m)。
  • 随机选择一个初始值(胶水值)v∈{0,1}b。

步骤 2:填充诱饵 对于环中除自己以外的所有成员 i≠s:

  • 随机选择 xi∈Zni。
  • 计算 yi=gi(xi)=xiei(modni)。
  • 此时,我们有了所有的 yi,唯独缺少 ys。

步骤 3:逆向求解 ys 我们需要解环方程 Ck,v(y1,…,yr)=v 来求出 ys。 根据组合函数的定义,我们可以将方程展开。为了求出 ys,我们需要从方程的两端向中间“夹击”。

令 u0=v。 我们可以正向计算前 s−1 项的中间值:

ui=Ek(yi⊕ui−1)for i=1,…,s−1

同时,我们可以利用目标值 v 反向计算后 r−s 项的中间值(利用对称加密的可逆性 Dk):

ui−1=Dk(ui)⊕yifor i=r,r−1,…,s+1

(注:这里简化了索引,实际是从 v 开始逆向解密)

最终,我们会得到两个中间状态值,使得:

Ek(ys⊕us−1)=us

其中 us−1 是正向计算得到的,us 是反向计算得到的(或者说是使得后续链条最终回到 v 所需的值)。

于是,我们可以直接解出 ys:

ys=Dk(us)⊕us−1

步骤 4:计算陷门逆 现在我们有了 ys,但签名需要的是 xs(即 gs 的输入)。 由于签名者拥有私钥 ds,他可以计算:

xs=gs−1(ys)=ysds(modns)

步骤 5:输出签名 签名为元组:σ=(pk1,…,pkr;v;x1,…,xr)。


3. 验证算法 ​

验证者收到消息 m 和签名 σ。

  1. 恢复密钥: 计算 k=h(m)。
  2. 计算 yi: 对于所有 i=1…r,使用公钥计算 yi=gi(xi)=xiei(modni)。
  3. 验证环方程: 计算 Ck,v(y1,…,yr)。
  4. 判定: 如果计算结果等于 v,则签名有效;否则无效。

4. 数学证明与安全性分析 ​

A. 正确性证明 ​

命题: 如果签名是按照上述步骤生成的,那么验证算法一定输出 True。

证明: 验证者计算的是:

Z=Ek(yr⊕Ek(⋯⊕Ek(y1⊕v)…))

在签名生成过程中,我们构造 ys 的目的正是为了满足方程 Ck,v(y1,…,yr)=v。 具体来说,我们在步骤 3 中通过 ys=Dk(us)⊕us−1 强行使得加密链在 s 处连接,并且最终输出回到 v。 由于 xi 是通过 gi 正确生成的(yi=gi(xi)),验证者计算出的 yi 与签名者使用的一致。 因此,Z=v 恒成立。证毕。

B. 无条件匿名性证明 ​

命题: 即使攻击者拥有无限算力,甚至拥有环中所有成员的私钥,他猜中真实签名者的概率也是 1/r。

证明思路: 我们需要证明签名 σ 的分布与真实签名者 s 的身份无关。

  1. v 的分布: v 是均匀随机选择的。
  2. xi(i≠s) 的分布: 是均匀随机选择的。
  3. yi(i≠s) 的分布: 由于 gi 是置换,yi 也是均匀分布的。
  4. ys 的分布:ys=Dk(us)⊕us−1由于 Ek 是伪随机置换,且 v 和其他 yi 都是随机的,中间值 us 和 us−1 对于观察者来说看起来也是随机的。因此 ys 在 {0,1}b 上也是均匀分布的。
  5. xs 的分布: xs=gs−1(ys)。由于 gs 是置换,xs 也是均匀分布的。

结论: 对于任何观察者来说,签名中的每一个分量 (x1,…,xr) 看起来都是从各自的域中均匀随机抽取的。没有任何统计特征能将签名与特定的 s 联系起来。即使攻击者拥有所有私钥,他也无法区分“真实的签名”和“模拟的签名”(即攻击者自己随机选一个 s 并伪造一个满足方程的签名)。因此,匿名性是无条件的(信息论安全的)。

基于椭圆曲线的方案 ​

其实从上面的描述中不难看出,本质上就是一个公钥方案的变形,故而很自然地就能得出在EC上的方案描述

1. 密钥生成 ​

  1. 选择椭圆曲线参数:选定一条标准的椭圆曲线,并确定其基点(生成元)G 和阶 n。
  2. 生成密钥对:对于环中的 N 个成员,每个成员独立生成自己的密钥对: ( ski, pki = skiG)

所有成员的公钥集合 pk0,pk1,...,pkN−1 构成了这个“环”。

2. 签名 ​

假设签名者在环中的位置为 s(采用 0-based 索引,即成员编号为 0,1,…,N−1)。

  1. 选择随机起点:

    • 随机选择 α∈Zn,并计算临时承诺 U=αG。
    • 令挑战从 s 的下一个位置开始(按模 N 计算):c(s+1)modN=H(m∥U)
  2. 沿环生成(除签名者外):

    • 按环索引遍历 i=(s+1)modN,(s+2)modN,…,(s+N−1)modN(即所有 i≠s):
      • 随机选择 ri∈Zn;
      • 计算Ri=riG+cipki
      • 再计算下一项挑战c(i+1)modN=H(m∥Ri)
  3. 计算签名者响应并闭环:

    • 当链回到 i=s 时,已知 cs,计算rs=(α−cs⋅sks)modn
    • 则Rs=rsG+cspks=αG=U
    • 因而H(m∥Rs)=H(m∥U)=c(s+1)modN

    闭环成立。

  4. 生成签名:

    • 签名输出为σ=(c0,r0,r1,…,rN−1)
    • 其中 c0 是挑战链绕环后的第一项,不是独立预设的随机值。

3. 验签 ​

任何验证者已知:消息 m、签名 (c0,r0,...,rN−1) 以及环中所有成员的公钥 pk0,...,pkN−1 来验证签名的有效性。

  1. 重新计算:

    • 从签名给出的 c0 开始,对 i=0,1,…,N−1 依次计算:Ri=riG+cipkic(i+1)modN=H(m∥Ri)
  2. 检查闭环:

    • 计算最后一步得到的闭环挑战:c0′=H(m∥RN−1)
    • 检查是否满足:c0′=c0

如果成立,则验证通过。这证明了签名确实由环中某个持有对应私钥的成员生成,但无法确定具体身份,从而实现匿名性。

本质上,我们是让 U(=αG) 与签名者位置的承诺一致,即 U=rsG+cssksG。