Monero技术详解(二):一次性地址

  • victorsun
  • 更新于 2020-06-11 13:23
  • 阅读 6012

每次发送交易时,发送方根据接收方的地址,随机产生临时公钥来接收交易。由于临时公钥的随机性,交易接收方的不同交易之间的关联性被打破了。而拥有临时公钥对应私钥的接收方,可以用该临时私钥将来消费这笔UTXO。

系列导航: Monero技术详解(一):技术方案总览 Monero技术详解(二):一次性地址 Monero技术详解(三):核心技术——环签名(1) Monero技术详解(四):隐藏交易数额之Pederson承诺


UTXO模型中,通常每一笔UTXO的都显示地标示出该UTXO的所属者,所属者的标识符为地址。目前在绝大多数采用地址作为标识符的密码货币项目中,地址都是由公钥采用确定性压缩、编码得出,这样同一用户的不同交易会根据地址的确定唯一性而相关联。这一特性是隐私保护所极力避开的。

由于地址与公钥是通过编码建立对应关系,并且为了方便叙述,以下描述中可能用公钥来代替地址。

Monero采用了一次性地址的方案来解决此问题。Monero的做法是让用户掌握一确定、唯一的公私钥对。与其他项目类似,公钥对外公布。每次发送交易时,发送方根据接收方的地址,随机产生临时公钥来接收交易。由于临时公钥的随机性,交易接收方的不同交易之间的关联性被打破了。而拥有临时公钥对应私钥的接收方,可以用该临时私钥将来消费这笔UTXO。

1. 基于椭圆曲线的一次性公钥

如比特币等使用的ECDSA方案,用户随机产生私钥$k$,且令公钥$K\leftarrow kG$,其中$G$是椭圆曲线的基点(或称为生成元)。$(k,K)$组成签名功能最基本的密钥对。由于椭圆曲线上的点具有同态可加性(留意这个性质,后面的很多功能都依赖于这个特性而实现),在该密钥对上添加随机噪声项,从而获得一次性公私钥来用于真正的交易。

2. 随机噪声化的公私钥

用户Bob如上产生一公私钥对$(k,K)$。对外公布长期公钥$K$,当另一用户Alice向Bob发送交易(传递UTXO)时,可选取随机数$r$,并令一次性公钥$K^{O} \leftarrow rG + K$,Alice讲交易发送到公钥$K^{O}$,同时随着交易数据,将随机数$r$传递给Bob。注意到$K^{O} = (r + k)G$,对应的一次性私钥是$k^{O} \leftarrow (r + k)$。之后Alice需要通过这个私钥来消费刚接收到的UTXO。

很容易看出来,以上的一次性密钥对方案并不能隐藏接收者Bob的地址信息。因为直接暴露的随机数$r$让所有的参与者都可以从Bob的一次性公钥$K^{O}$中恢复出长期公钥$K$。导致这一问题的根本原用是随机数$r$在传递过程中的暴露。那么如何将$r$以私密的方式传递给Bob?Monero使用Diffie-Hellman秘密交换协议。

3. DH秘密传递随机噪声

Alice将选择的随机数$r_1$,并用Bob公布的公钥$K$对$r_1$进行隐藏$R\leftarrow r_1G$,将隐藏的结果通过公开信道传递给Bob(如附加于交易上链)。根据DH方案的原理,这时Alice和Bob已经共享了一秘密消息,公开信道上的其他用户却获取不到该消息,该为$N \leftarrow r_1kG$。实际上,在Alice一侧,$N = r_1K$;在Bob一侧,$N = kR$。其他用户值看到$R$,无法获取其中隐藏的$r_1$。

这样Alice和Bob分享了一随机数$N$(虽然不是直接随机选择的随机数),让其替代上一节中的$r$的位置,就可以解决上一节的问题了。但是此处一个需要解决的问题:$N$是椭圆曲线上的点,是二维向量。可以使用一安全的Hash函数$\mathcal{H}_n(P)$将椭圆曲线上的点映射到标量。一次性公钥方案是:

  1. Alice选取随机数$r$,并令$K^{O} \leftarrow \mathcal{H}_n(rK)G + K$,$R\leftarrow rG$,在将$R$公开发送;
  2. Bob获取到$R$,按照$K^{O}_1 \leftarrow \mathcal{H}_n(kR)G + K$,比对$R$对应的$K^{O}$,若一致,则说明该一次性地址属于自己,恢复一次性私钥$k^{O} \leftarrow \mathcal{H}_n(kR) + k$。

4. 剥离成两对密钥

想象下,在以上的方案中,Bob需要观察每笔交易中的每个UTXO中的数据,来确定UTXO是否发送给自己。需要计算获得$K^{O}_1$,并比对该UTXO中$K^{O}$。在这种做法中,用户都只能自己计算$K^{O}_1$,因为计算需要长期私钥$k$的参与。对于钱包终端用户,这种大量的计算会消耗大量终端资源。寻求一种可以代理观察UTXO并且不暴露长期私钥的方案。

Monero的做法是分两组密钥,一组可以委托给钱包观察者,让其代为识别UTXO,另一组用来真正的消费接受的UTXO。

Bob产生这样两对密钥$(k^{v},K^v\leftarrow k^{v}G)$, $(k^{s},K^s\leftarrow k^{s}G)$,分别被称为观察密钥(观察私钥+观察公钥)和消费密钥(消费私钥+消费公钥)。并且对外公布两个公钥$(K^v,K^s)$作为其使用地址(或经过必要的编码)。一次性公钥方案是:

  1. Alice选取随机数$r$,并令$K^{O} \leftarrow \mathcal{H}_n(rK^v)G + K^s$,$R\leftarrow rG$,在将$R$公开发送;
  2. Bob获取到$R$,按照$K^{O}_1 \leftarrow \mathcal{H}_n(k^vR)G + K^s$,比对$R$对应的$K^{O}$,若一致,则说明该一次性地址属于自己,恢复一次性私钥$k^{O} \leftarrow \mathcal{H}_n(k^vR) + k^s$。

5. 代理观察

Bob将其观察密钥$(k^{v},K^v)$交给一个代理人Proxy。Proxy没收到一笔UTXO,都会计算$K^{O}_1 \leftarrow \mathcal{H}_n(k^vR)G + K^s$,比对$R$对应的$K^{O}$,若一致,则将UTXO的数据全部发送给Bob,Bob记录该UTXO,在需要消费该UTXO时,恢复一次性私钥$k^{O} \leftarrow \mathcal{H}_n(k^vR) + k^s$。

总之,在Monero种出现的地址或者公钥,基本都是一次性的。一次性地址的方案让每个UTXO都具有不同一次性地址,这样,即使不同的UTXO属于同一个接收人用户,也不会公开显示出来,消除了不同交易之间的关联性

点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
victorsun
victorsun
江湖只有他的大名,没有他的介绍。