参考自
环签名指的是在n个公钥中隐藏自己拥有私钥的那个公钥,具体应用就在于区块链上隐藏交易发送人(地址/公钥)。
准备
首先定义以下函数,其中
Ek为对称加密算法,k为
Ek对应的对称密钥
Ck,v(y1,y2,…,yn)=Ek(yn⊕Ek(yn−1⊕Ek(⋯⊕Ek(y1⊕v)…)))=v
情景
对消息m的环签名(公钥
P1...Pn)。我拥有
Ps对应的私钥,下面的例子假设s为3。
利用公钥
Pi对
xi进行加密可以表示为
yi=gi(xi),利用对应私钥对
yi进行解密可以表示为
xi=gi−1(yi)。
过程
- 令k=hash(m),k未来作为
Ek对应的对称密钥
- 随机选取一个值v
- 随机选取n-1个值
{x1,x2,x4,...,xn},并通过
yi=gi(xi)计算得到相应的
{y1,y2,y4,...,yn}
- 令
Ck,v(y1,y2,…,yn)=v,计算得到令等式成立的
y3
- 我们可以把
y3看作是通过公钥
P3加密得到,而我拥有
P3对应的私钥,所以我们可以通过
xi=gi−1(yi),解密
y3得到
x3
- 最后我们得到了关于消息m的环签名,是一个2n+1元组
(P1,P2,…,Pn;v;x1,x2,…,xn),透过这个签名,我们不能获知我真正拥有私钥的是
P3,因为看不出区别。
- 通过公钥
{P1,...,Pn}通过
yi=gi(xi)相应地对
{x1,...,x2} 进行加密得到
{y1,...,yn}
- 计算
Ek用的对称密钥,即
k=Hash(M)
- 验证等式
Ck,v(y1,y2,…,yn)=v是否成立