Zcash - 各种密钥和签名,你懂吗?

Zcash的发展大体经过了OverWinter(过冬) -> Sprout(发芽) -> Sapling(树苗)这几个阶段,随着业务和功能的逐渐丰富,密钥系统也越来越复杂,刚开始接触时感觉一头雾水,但是静下心来仔细分析,就能逐渐领略其中的魅力。
Zcash中的各种密钥,主要是为了实现下面2类功能:
1.Signature
2.In-band secret distribution
签名很好理解,主要是为了保证数据的不可篡改性。那么什么是in-band secret distribution呢?我们知道,Zcash使用了零知识证明,因此交易内部的私密信息对外是隐藏的。但是,如果我想要消费某一笔交易的输出(Note),就必须提供这些私密信息(用于生成Nullifier)。问题来了,交易发送方如何把这些私密信息传递给交易接收方呢?有2种方案:
1.Out-band secret distribution:其实就是“线下”传递,通过一些加密的P2P即时通信工具,比如以太坊的whisper。这种方案比较简单,但是也存在一些缺点,比如要求交易双方必须同时在线,否则就必须引入一些消息持久化方案比如mail server等等。
2.In-band secret distribution:即“线上”传递,也是Zcash目前采用的方案。线上传递的意思是把这些私密信息加密后直接放到交易中上链,接收方再通过某种方式解密以获得私密信息。
下面就逐一介绍一下Sprout和Sapling中的密钥系统,以及在签名及In-band secret distribution中的应用。

1.Sprout

1.1 Sprout密钥系统

Sprout的密钥系统比较简单,参见下图:

其中Payment Address是发送方需要用到的,Incoming viewing key是给接收方用的。
下面会逐一介绍图上的这些密钥的含义,如果你觉得枯燥难懂,可以先跳过,等看完“签名”和“带内秘密分发”之后再回过头来看这段描述,相信会有不一样的体会。
1. a s k a_{sk} ask:Spending Key,用于生成Nullifier
2. a p k a_{pk} apk:Paying Key,用于生成Note
3.sk_{enc}$:Receiving Key,和epk一起生成sharedSecret,进而生成对称密钥,解密所有的Note Plaintext
s h a r e d S e c r e t = C u r v e 25519 ( s k e n c , e p k ) = s k e n c ⋅ e p k = s k e n c ⋅ e s k ⋅ G sharedSecret=Curve25519(sk_{enc},epk)=sk_{enc} \cdot epk=sk_{enc} \cdot esk \cdot G sharedSecret=Curve25519(skenc,epk)=skencepk=skenceskG
4. p k e n c pk_{enc} pkenc:Transmission Key,和esk一起生成sharedSecret,进而生成对称密钥,加密所有的Note Plaintext
s h a r e d S e c r e t = C u r v e 25519 ( e s k , p k e n c ) = e s k ⋅ p k e n c = e s k ⋅ s k e n c ⋅ G sharedSecret=Curve25519(esk,pk_{enc})=esk \cdot pk_{enc}=esk \cdot sk_{enc} \cdot G

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值