1. 引言

【还有个ockockock:outgoing cipher key,用于encrypt an outgoing ciphertext。】

在Zcash协议中,用户若想接收shielded payments,则其必须拥有a shielded payment address,该shielded payment address 可由 a spending key 生成。

相比于Sprout,Sapling中增加了更多的key类型。下图中的箭头指向表示了key之间的衍生关系;双线型表示的相同的key,只是做了不同的抽象。

在Sprout中,有:

  • receiving key skencsk_{enc}skenc​
  • incoming viewing key ivk=(apk,skenc)ivk=(a_{pk}, sk_{enc})ivk=(apk​,skenc​)
  • shielded payment address addrpk=(apk,pkenc)addr_{pk}=(a_{pk},pk_{enc})addrpk​=(apk​,pkenc​)

Sprout中的这些key都衍生自spending key aska_{sk}ask​

下图摘自博客 Zcash - 各种密钥和签名,你懂吗?:

在Sapling中,有:

  • Spending key sksksk,为256bit的random值。

  • Expanded spending key (ask,nsk,ovk)(ask, nsk, ovk)(ask,nsk,ovk),其中askaskask为Spend authorizing key,nsknsknsk为nullifier private key,ovkovkovk为outgoing viewing key。ask,nskask,nskask,nsk均为scalar field值,ovkovkovk为32byte值。

  • Proof authorizing key (ak,nsk)(ak, nsk)(ak,nsk),其中akakak为Jubjub Point,与askaskask的关系为ak=ask∗Jubjub.SpendingKeyGeneratorak=ask\ *\ \text{Jubjub.SpendingKeyGenerator}ak=ask ∗ Jubjub.SpendingKeyGenerator。

let ak = fixed_scalar_mult(ask, FixedGenerators::SpendingKeyGenerator);
  • Full viewing key (ak,nk,ovk)(ak,nk,ovk)(ak,nk,ovk),其中nknknk为Jubjub Point,与nsknsknsk的关系为nk=nsk∗Jubjub.ProofGenerationKeynk=nsk\ *\ \text{Jubjub.ProofGenerationKey}nk=nsk ∗ Jubjub.ProofGenerationKey。
let nk = fixed_scalar_mult(nsk, FixedGenerators::ProofGenerationKey);
  • Incoming viewing key ivkivkivk,取值范围为[1,2251−1][1,2^{251}-1][1,2251−1],根据ak,nkak,nkak,nk计算获得。
#[no_mangle]
pub extern "system" fn librustzcash_crh_ivk(ak: *const [c_uchar; 32],nk: *const [c_uchar; 32],result: *mut [c_uchar; 32],
) {let ak = unsafe { &*ak };let nk = unsafe { &*nk };let mut h = Blake2s::with_params(32, &[], &[], CRH_IVK_PERSONALIZATION);h.update(ak);h.update(nk);let mut h = h.finalize().as_ref().to_vec();// Drop the last five bits, so it can be interpreted as a scalar.h[31] &= 0b0000_0111;let result = unsafe { &mut *result };result.copy_from_slice(&h);
}

  • diversified shielded payment address addrd=(d,pkd)addr_d=(d,pk_d)addrd​=(d,pkd​)(由Diversifier ddd和 Transmission key pkdpk_dpkd​组成)。diversifier ddd为88bit随机值,要求存在与ddd对应的diversified base gd=DiversifyHashSapling(d)g_d = DiversifyHash^{Sapling}(d)gd​=DiversifyHashSapling(d)。【可借助encodePaymentAddress()函数,将d,pkdd,pk_dd,pkd​组合成一串单一的shielded payment address。】
#[no_mangle]
pub extern "system" fn librustzcash_check_diversifier(diversifier: *const [c_uchar; 11]) -> bool {let diversifier = sapling_crypto::primitives::Diversifier(unsafe { *diversifier });diversifier.g_d::<Bls12>(&JUBJUB).is_some()
}

根据ivkivkivk和ddd 可生成相应的diversified transmission key pkdpk_dpkd​,pkdpk_dpkd​为Jubjub point。

#[no_mangle]
pub extern "system" fn librustzcash_ivk_to_pkd(ivk: *const [c_uchar; 32],diversifier: *const [c_uchar; 11],result: *mut [c_uchar; 32],
) -> bool {let ivk = read_fs(unsafe { &*ivk });let diversifier = sapling_crypto::primitives::Diversifier(unsafe { *diversifier }); //此处即为Diversify Hash函数。if let Some(g_d) = diversifier.g_d::<Bls12>(&JUBJUB) { let pk_d = g_d.mul(ivk, &JUBJUB);let result = unsafe { &mut *result };pk_d.write(&mut result[..]).expect("length is 32 bytes");true} else {false}
}

对于每个spending key,对应有a default diversified payment address with a “random-looking” diversifier。若无法区分default address和以上通过random diversifier生成的地址,则可实现不暴露diversified addresses as a user-visible feature。但是实际zcashd wallet中并未使用default diversified payment address,而是采用ZIP-32 中的方案来生成
注意,整个协议中使用Bech32.encode()是可能产生vanity address的,从而可能会存在泄漏隐私的问题。软件开发者在实际实现时要注意使用randomly chosen diversifier,同时也建议 diversifiers be randomly chosen unique values used to index into a database, rather than directly encoding the needed data。

Zcash的共识协议不依赖于expanded spending key的构建方式。expanded spending key的构建方式有以下两种:

  1. 随机生成spending key sksksk,基于sksksk生成expanded spending key (ask,nsk,ovk)(ask,nsk,ovk)(ask,nsk,ovk)。
  2. 根据 ZIP-32,其中包含了expanded spending key的superset。该方式已用于Hierarchical Deterministic Wallet中。但是目前Zcash还不支持Hierarchical Deterministic Wallet address。

在zcashd(Zcash的官方客户端软件)中,所有的Sapling keys和addresses都是根据 ZIP-32生成的。

Sapling中的shielded payment addresses、incoming viewing keys、full viewing keys和spending keys均为a cryptographic protocol detail,这些信息正常来说不应直接暴露给用户。但是,user-visible operations需要知悉shielded payment address、incoming viewing key、(或)来自于spending key或extended spending key的full viewing key。
【在Sapling中,对于每一个spending key,其对应的full viewing key可在无spend authority的情况下,识别出incoming和outgoing notes。具体的解决方案为在每个Output description中增加额外的ciphertext。】

用户可 以一个shielded payment address 来接收来自 多方的支付,事实上,这些支付指向的是同一收款人 这一信息并不会暴露在区块链上,即使是对支付方来说,也无法知悉这些支付指向的是同一收款人。但是,若两个支付方勾结比对了收款方对应的shielded payment address,则可完全确定指向的是同一收款人。为了避免这种情况,收款方可为每个支付方创建不同的shielded payment address。

在Sapling中,提供了一种为同一spending authority 高效生成diversified payment addresses的机制,这些diversified payment addresses共享相同的full viewing key和incoming viewing key。创建大量这样的diversified payment addresses并不会给 扫描区块链以获取相关交易 增加额外开销。

密码学传统上将非对称加密中用于加密的key称为“public key”。transmission key中作为public key的为pkencpk_{enc}pkenc​或pkdpk_dpkd​。这个public key不需要单独分发,因为其已包含在shielded payment address中。

同时注意,控制shielded payment address的分发在某些应用场景下是必要的。同时,这也有助于减少整个协议对 note encryption中使用的密码学安全性的依赖。【具体可参见Zcash Protocol Specification 4.17节“In-band secret distribution (Sapling)”中的分析,知道某些pkdpk_{d}pkd​的攻击者可尝试寻找整个密码学系统中的某些假设薄弱点。】

2. Sapling Key Components

Sapling中,有:

  • lPRFexpand为N=512,lsk为256,livkSapling为251,lovk为256,ld为88l_{PRFexpand}为\mathbb{N}=512, l_{sk}为256, l_{ivk}^{Sapling}为251, l_{ovk}为256, l_{d}为88lPRFexpand​为N=512,lsk​为256,livkSapling​为251,lovk​为256,ld​为88 均为常量。
  • J(r),J(r)∗,J∗(r),reprJ,rJ\mathbb{J}^{(r)},\mathbb{J}^{(r)*},\mathbb{J}_{*}^{(r)},repr_{\mathbb{J}},r_{\mathbb{J}}J(r),J(r)∗,J∗(r)​,reprJ​,rJ​ 均为Jubjub相关参数,其中:
    J(r)\mathbb{J}^{(r)}J(r)为order-rJr_{\mathbb{J}}rJ​ subgroup of J\mathbb{J}J。该subgroup中包含了OJ\mathcal{O}_{\mathbb{J}}OJ​。除OJ\mathcal{O}_{\mathbb{J}}OJ​之外的,order 为rJr_{\mathbb{J}}rJ​的point set表示为J(r)∗\mathbb{J}^{(r)*}J(r)∗。
  • FindGroupHashJ(r)∗FindGroupHash^{\mathbb{J}^{(r)*}}FindGroupHashJ(r)∗为“Group Hash into Jubjub”。返回无效point的概率接近2−2562^{-256}2−256。
  • PRFexpand和PRFockSaplingPRF^{expand}和PRF^{ockSapling}PRFexpand和PRFockSapling为Pseudo Random Functions。
  • KASaplingKA^{Sapling}KASapling为Sapling Key Agreement。
  • CRHivkCRH^{ivk}CRHivk为CRHivkCRH^{ivk}CRHivk Hash Function。
  • DiversifyHashSaplingDiversifyHash^{Sapling}DiversifyHashSapling为DiversifyHashSaplingDiversifyHash^{Sapling}DiversifyHashSapling Hash Function。
  • SpendAuthSigSaplingSpendAuthSig^{Sapling}SpendAuthSigSapling Spend Authorization Signature (Sapling),为a signature scheme with re-randomizable keys。
  • LEBS2OSP为(l:N)×B[l]−>BY[ceiling(l/8)](l:\mathbb{N})\times\mathbb{B}^{[l]}->\mathbb{B}^{\mathbb{Y}^{[ceiling(l/8)]}}(l:N)×B[l]−>BY[ceiling(l/8)]
    LEOS2IP为(l:N∣lmod8=0)×BBY[l/8]−>{0⋯2l−1}(l:\mathbb{N}|l\mod 8 = 0)\times\mathbb{B}^{\mathbb{B}^{\mathbb{Y}^{[l/8]}}}->\{0\cdots 2^l-1\}(l:N∣lmod8=0)×BBY[l/8]−>{0⋯2l−1}。
    LEBS2OSP和LEOS2IP为“Integers, Bit Sequenes, and Endianness”中相关定义。

3. Sapling Payment Addresses

Sapling 的shielded payment address 为addrd=(d,pkd)addr_d=(d,pk_d)addrd​=(d,pkd​)(由88-bit Diversifier ddd和 256-bit Transmission key pkdpk_dpkd​组成)。其raw encoding规则分别为:

  • LEBS2OSP88(d)LEBS2OSP_{88}(d)LEBS2OSP88​(d)
  • LEBS2OSP256(reprJ(pkd))LEBS2OSP_{256}(repr_{\mathbb{J}}(pk_d))LEBS2OSP256​(reprJ​(pkd​))

encoding以后再加上某些Human-Readable前缀,如Zcash主网上的shielded payment address以“zs”打头,而Zcash测试网上的shielded payment address则以“ztestsapling”打头。

Shielded payment address 中包含的transmission key pkdpk_dpkd​ 可用于 a “key-private” asymmetric encryption scheme。所谓"key-private"是指,ciphertexts中不会泄露其加密key的信息,只对拥有加密key对应private key(此处也可称为receiving key)的一方可见。该机制主要用于communicate encrypted output notes on the block chain to their intended recipient,拥有receiving key的一方可扫描区块链来获取notes addressed to them 并 decrypt those notes。

4. Sapling Incoming Viewing Keys

Sapling中的ivkivkivk取值范围为[1,2251−1][1,2^{251}-1][1,2251−1],实际实现以256-bit表示,其中最高的5个-bit会做置零操作。
Zcash主网上的incoming viewing key前缀为“zivks”,测试网的incoming viewing key前缀为“zivktestsapling”。

5. Sapling Full Viewing Keys

Full viewing key (ak,nk,ovk)(ak,nk,ovk)(ak,nk,ovk),其中ak,nkak,nkak,nk为Jubjub point,outgoing viewing key ovkovkovk 为32byte值。可将其编码为一个单独的串,编码规则为:

  • LEBS2OSP256(reprJ(ak))LEBS2OSP_{256}(repr_{\mathbb{J}}(ak))LEBS2OSP256​(reprJ​(ak))
  • LEBS2OSP256(reprJ(nk))LEBS2OSP_{256}(repr_{\mathbb{J}}(nk))LEBS2OSP256​(reprJ​(nk))
  • 32-byte ovkovkovk

在Zcash主网中,full viewing key前缀为“zviews”,测试网的前缀为“zviewtestsapling”。

在Sapling中,每一个spending key都有相应的full viewing key,full viewing key可用于recognize both incoming and outgoing notes without having spend authority。具体是通过每个Output description中额外的ciphertext——CoutC^{out}Cout 来实现的。详细可见博客 Zcash中的加解密机制。

6. Sapling Spending Keys

Sapling中的spending key 以256-bit表示。
Zcash主网中的spending key前缀为“secret-spending-key-main”,测试网的前缀为“secret-spending-key-test”。

Spending key为私钥的一种,拥有spending key的用户可spend the balance of the associated address。对于shielded address,拥有相应spending key的用户可查看address’ balance and transaction data。

参考资料

[1] Zcash Protocol Specification
[2] 博客 Zcash - 各种密钥和签名,你懂吗?
[3] Zcash Protocol Specification
Version 2021.1.22 [NU5 proposal]
[4] Zcash官方文档

Zcash中的keys和addresses相关推荐

  1. Zcash中的signatures

    1. 引言 在 Zcash Protocol Specification 中,约定对signature是"validate",对zk-SNARK proof是"verif ...

  2. Zcash中的Notes

    1. 引言 本文主要关注Sapling note. Zcash中Sapling note以n\mathbf{n}n表示,其代表a value vvv is spendable by the recip ...

  3. 打印出所有的 info.plist 中的 keys、values

    打印出所有的 info.plist 中的 keys.values // get all keys and values in info.plist NSBundle* mainBundle = [NS ...

  4. Zcash中的zk-SNARK statements

    1. 引言 zero-knowledge proving system为a cryptographic protocol,用于证明: a particular statement,dependent ...

  5. Zcash中的加解密机制

    1. 引言 接前序博客 Zcash中的Notes. Sapling note的组成为tuple n=(d,pkd,v,rcm)\mathbf{n}=(d, pk_d, v, rcm)n=(d,pkd​ ...

  6. Zcash中的description

    1. 引言 Zcash 中支持的description类型有: JoinSplit description Spend description Output description JoinSplit ...

  7. Zcash中的hash函数

    1. 引言 Zcash中的hash函数主要有: BLAKE2 Hash Function Group Hash into Jubjub Pedersen Hash Function Mixing Pe ...

  8. php object keys_原生js中Object.keys方法详解

    实际开发中,有时需要知道对象的所有属性,原生js提供了一个方法Object.keys(). Object.keys(obj)返回的是一个数组,该数组的所有元素都是字符串.这些元素是来自于给定的obj可 ...

  9. redis生产环境中慎用keys模糊匹配方法

    Redis是一个key-value存储系统.和Memcached类似,但性能远高于memcached.现在很多大型互联网公司都在使用redis作为自己的缓存实现,但是如果没有合理使用好redis,比如 ...

最新文章

  1. mysql 字段必填 属性_如何判断数据库中的字段是否具有必填属性(50分)
  2. 获取在线APP的素材图片
  3. Asp.net 中使用单独类文件
  4. 228. Summary Ranges
  5. PDU (Protocol Data Unit) - 协议数据单元
  6. python多级字典嵌套_使用pythonscsv DictReader创建多级嵌套字典
  7. 多元线性回归数据集_TensorFlow学习Program1——13.实现一元、多元线性回归(基于房价数据集)...
  8. jQuery Mobile中面板panel的data-*选项
  9. pr人像磨皮美容插件:Beauty Box for Premiere Pro
  10. 史密斯圆图matlab,用MATLAB程序实现Smith圆图的图解过程
  11. 我常去的编程技术网站[最近更新:2011.07.10
  12. 【NOIP2016提高组复赛】蚯蚓 题解
  13. 合并Python列表的魔幻12法
  14. python做正态分布的例子_python 绘制正态曲线的示例
  15. 微小宝公众号排行榜_微小说免费阅读网公众号大全推荐资源网
  16. Capture Modules 车载网络报文捕获(监听)模块(低时延、802.1AS时钟同步)
  17. 视觉SLAM入门 -- 学习笔记 - Part3
  18. C++语法学习笔记二十九: 详解decltype含义,decltype主要用途
  19. 华为 AISC 研究型实习生招聘~北京 or 深圳
  20. sql镜像备份 转 浪客 博客

热门文章

  1. MATLAB作图技巧汇总
  2. sklearn专题四:降维算法
  3. 下一代机器学习的应走之路
  4. 迅为LS2k1000龙芯国产双核开发板烧写系统到 U 盘
  5. 三个月自学自动化测试,鬼知道我经历了什么?薪资从4.5K到11K
  6. 诙谐幽默的个性自我介绍
  7. IT转互联网的转行经验
  8. 对于昨夜梦里对某外网电商平台web渗透测试总结体会
  9. Jquery ajax, Axios, Fetch区别之我见 Axios中文说明
  10. 网络游戏的体验度量方法