Skip to content

Intro to Ring Signature

基于RSA的方案描述

1. 核心数学构件

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

A. 陷门单向置换

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

gi(x)=xei(modni)

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

gi1(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(yrEk(yr1Ek(y1v)))

其中:

  • 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:填充诱饵 对于环中除自己以外的所有成员 is

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

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

u0=v。 我们可以正向计算前 s1 项的中间值:

ui=Ek(yiui1)for i=1,,s1

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

ui1=Dk(ui)yifor i=r,r1,,s+1

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

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

Ek(ysus1)=us

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

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

ys=Dk(us)us1

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

xs=gs1(ys)=ysds(modns)

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


3. 验证算法

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

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

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

A. 正确性证明

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

证明: 验证者计算的是:

Z=Ek(yrEk(Ek(y1v)))

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

B. 无条件匿名性证明

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

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

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

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

基于椭圆曲线的方案

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

1. 密钥生成

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

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

2. 签名

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

  1. 选择随机起点

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

    • 按环索引遍历 i=(s+1)modN,(s+2)modN,,(s+N1)modN(即所有 is):
      • 随机选择 riZn
      • 计算Ri=riG+cipki
      • 再计算下一项挑战c(i+1)modN=H(mRi)
  3. 计算签名者响应并闭环

    • 当链回到 i=s 时,已知 cs,计算rs=(αcssks)modn
    • Rs=rsG+cspks=αG=U
    • 因而H(mRs)=H(mU)=c(s+1)modN

    闭环成立。

  4. 生成签名

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

3. 验签

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

  1. 重新计算

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

    • 计算最后一步得到的闭环挑战:c0=H(mRN1)
    • 检查是否满足:c0=c0

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

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