主页
微信公众号:密码应用技术实战
博客园首页:https://www.cnblogs.com/informatics/
GIT地址:https://github.com/warm3snow
简介
在前面几篇博文中我们介绍了门罗币的两种隐私保护技术:隐形地址和环签名,这两种技术主要用户保护发送者和接收者的身份,但是无法提供交易金额的隐私性。在实际交易中,交易金额是一个重要的隐私信息,因为交易金额可以泄露用户的消费习惯和财务状况。
门罗币隐私保护技术:
本文将继续介绍门罗币的另一项隐私保护核心技术:机密交易。
基础知识
Pedersen承诺
在前文《密码学承诺原理与应用 - 概览》中,我们介绍了密码学承诺的基本概念和应用。并对Pedersen承诺的基本原理和构造进行了概述。
Pedersen承诺构造和流程如下:
- [01] 承诺阶段:发送方选择一个明文\(m\)和一个随机数\(r\),计算承诺值\(C = g^m \cdot h^r\),并发送\(C\)给接收方。
- [02] 打开阶段:发送方揭示明文\(m\)和随机数\(r\)。
- [03] 验证阶段:接收方重新计算承诺值\(C^{'} = g^m \cdot h^r\),并验证\(C^{'}\)和\(C\)是否相等。
对应的基于ECC的Pedersen承诺构造如下:
- 承诺阶段:发送方选择一个明文\(m\)和一个随机数\(r\),计算承诺值\(C = mG + rH\),并发送\(C\)给接收方。
- 打开阶段:发送方揭示明文\(m\)和随机数\(r\)。
- 验证阶段:接收方重新计算承诺值\(C^{'} = mG + rH\),并验证\(C^{'}\)和\(C\)是否相等。
Pedersen承诺有几个重要的性质:
- 隐藏性:通过引入随机数\(r\),承诺值\(C\)隐藏了明文\(m\)的信息,同一个消息的多个承诺值\(C\)是不同的,且无法推导出明文\(m\)。
- 绑定性:发送方不能在承诺\(C\)后,重新选择不同的明文\(m^{'}\)和随机数\(r^{'}\),使得\(C = m^{'}G + r^{'}H\)。
- 加法同态性:两个Pedersen承诺的和等于明文的和的Pedersen承诺。
Pedersen承诺的同态性在零知识证明、范围证明等隐私保护技术中有重要应用。同态性质如下:
假设有两个Pedersen承诺\(C_1 = m_1G + r_1H\)和\(C_2 = m_2G + r_2H\),则
当\(m_1 = m_2\)时,\(C_1 - C_2 = (r_1 - r_2)H\),即可以计算出两个承诺的差值。
范围证明
范围证明(Range Proof)是一种零知识证明机制,在不泄露明文的情况下,证明明文在一个合理的范围内。例如证明转账金额在\([0, 2^{64} - 1]\)之间。最常见的范围证明技术是Bulletproof。在门罗币和Grin等隐私币中,就是使用Bulletproof技术来证明交易金额在一个合理的范围内。
Bulletproof范围证明基本原理如下:
- 设\(u \in \mathbb{Z}_p\) 并且设\(V \in G\)是对\(v\)的一个 Pedersen 承诺。范围证明系统将使验证者相信\(u \in [0, 2^n - 1]\)。换句话说,证明系统证明了以下关系:
其中,\(g\)和\(h\)是\(G\)生成元,\(V\)是Pedersen承诺,\(\gamma\)是随机数,\(u\)是挑战数。
- 将\(u\)的范围限制转换为等式形式
其中,\(\mathbf{a} = (a_0, a_1, a_2, ..., a_n)\),\(\mathbf{k^n} = (k^0, k^1, k^2, ..., k^n)\),\(\mathbf{0^n}\)是长度为\(n\)的全0向量。从上述公式可以看出,
- \(u\)的二进制表达等价于\(<\mathbf{a}, 2^n> = a_0 + 2a_1 + 4a_2 + ... + 2^n a_n\)
- \(\mathbf{b} = \mathbf{a} - \mathbf{1^n}\)和\(\mathbf{a} \cdot \mathbf{b} = \mathbf{0^n}\)等价于\(a_i\)的值为0或1, 即\(u \in [0, 2^n - 1]\)。
- 将上述等式转换为多项式形式,并使用Bulletproof技术转换为多项式承诺的形式进行证明。
注:Bulletproof的原理和实现比较复杂,涉及Pedersen向量承诺、内积承诺、折半算法等技术,本文暂不展开介绍。
门罗币机密交易
门罗币机密交易(Confidential Transactions)的基本思想是通过Pedersen承诺和Bulletproof范围证明技术,将交易金额隐藏在承诺值中,并通过范围证明证明交易金额在一个合理的范围内。
门罗币机密交易的交易模型如下:
- 输入:交易输入(Tx input)包括交易金额,其中交易金额通过Pedersen承诺隐藏在承诺值中, 即\(C_{in, i}\), 表示input交易的第\(i\)个输入金额的Pedersen承诺。
- 输出:交易输出(Tx input)包括输出金额,其中输出金额通过Pedersen承诺隐藏在承诺值中,即\(C_{out, i}\), 表示output交易的第\(i\)个输出金额的Pedersen承诺。并且每个输出金额携带一个Bulletproof范围证明,如图中\(RangeProof_{i}\)。
交易金额隐私性
门罗币机密交易的交易金额隐藏在Pedersen承诺中,Pedersen承诺的构造如下:
\[C = aG + bH \]其中,\(a\)是交易金额,\(b\)是随机数,\(G\)和\(H\)是椭圆曲线上的生成元。交易金额\(a\)通过Pedersen承诺隐藏在承诺值\(C\)中,只有发送方知道明文\(a\)和随机数\(b\)。由于接收方需要验证收到的金额,因此发送方需要共享明文\(a\)和随机数\(b\)。一种共享方式基于Diffie-Hellman密钥交换算法, 保证发送方和接收方能够分别计算出明文\(a\)和随机数\(b\)。
\[a_i= a \oplus H_n("amount", H_n(rP_i, i)) \]\[b_i = H_n("commitment\_mask", H_n(rP_i, i)) \]其中:
- \(H_n\)是哈希函数, 可以将任意长度的输入映射为固定长度的输出
- commitment_mask和amount是字符串常量
- \(P_i\)是发送方的公钥,\(i\)是UTXO的索引
- \(r\)是随机数,来自\(R = rG\)中的\(r\),由发送方生成
- \(\oplus\)是异或运算
需要注意的是,在计算\(rP_i\)时,由于发送方知道\(r\)和\(P_i\),因此可以直接计算出\(rP_i\)。接收方知道\(x_i\),虽然不知道\(r\)但\(R\)公开,因此可以通过\(x_iR = rx_iG=rP_i\)得到\(rP_i\)。综上,发送方和接收方都可以计算出\(a_i\)和\(b_i\),即接收方可以验证交易金额。由于第三方无法知道\(r\)或者\(x_i\),因此无法计算出\(a_i\)和\(b_i\),保证了交易金额的隐私性。
注:在接收方作为发送方花费收到UTXO时,可以通过相同的方式生成新的承诺,其中\(P_i\)是接收方的公钥(隐形地址)
在交易中,需要保证输入金额等于输出金额,即:
\[\sum_{i=1}^{n} Amout_{in, i} - \sum_{j=1}^{m} Amout_{out, j} = 0 \]根据Pedersen承诺的加法同态性质,上述等式可以转换密文形式,如下:
\[\sum_{i=1}^{n} C_{in, i} - \sum_{j=1}^{m} C_{out, j} = 0 \]\[\sum_{i=1}^{n} (m_{in, i}G + r_{in, i}H) - \sum_{j=1}^{m} (m_{out, j}G + r_{out, j}H) = (\sum_{i=1}^{n} r_{in, i} - \sum_{j=1}^{m} r_{out, j})H = 0 \]其中, \(\sum_{j=1}^{m} r_{out, j} = \sum_{j=1}^{m} b_i\),因此只需要生成\(n\)个随机数\(r_{in, i}\),并保证\(\sum_{i=1}^{n} r_{in, i} = \sum_{j=1}^{m} b_i\),即可保证输入金额等于输出金额。
生成随机数\(r_{in, i}\)的方法如下:
其中,\(RNG(\lambda)\)是为随机数函数,\(\lambda\)表示安全参数。上面公式表示生成\(n-1\)个随机数\(r_{in, i}\),最后一个随机数\(r_{in, n}\)可以通过下面公式计算:
\[r_{in, n} = \sum_{j=1}^{m} b_i - \sum_{i=1}^{n-1} r_{in, i} \]证明:\(\sum_{i=1}^{n} r_{in, i} = \sum_{j=1}^{m} b_i\)
\[\sum_{i=1}^{n} r_{in, i} = \sum_{i=1}^{n-1} r_{in, i} + r_{in, n} = \sum_{i=1}^{n-1} r_{in, i} + \sum_{j=1}^{m} b_i - \sum_{i=1}^{n-1} r_{in, i} = \sum_{j=1}^{m} b_i \]交易金额范围证明
门罗币机密交易中,每个输出金额都携带一个Bulletproof范围证明,证明交易金额在一个合理的范围内。范围证明主要功能是保证每个输出金额在\([0, 2^{64} - 1]\)之间。否则会出现负数金额,出现超额支付等问题。在门罗币中,每个输出金额的范围证明如下:
\[\{ (g, h \in G, V, \gamma; a, \gamma \in Z_p : V = g^a \cdot h^\gamma \land a \in [0, 2^{64} - 1]) \} \]其中,\(g\)和\(h\)是\(G\)生成元,\(V\)是输出金额\(a\)的Pedersen承诺,\(\gamma\)是随机数,\(a\)是交易金额。
Bulletproof范围证明原理暂时不做介绍,感兴趣的读者可以参考《Bulletproofs: Short Proofs for Confidential Transactions and More》。
结语
本文介绍了门罗币的另一项隐私保护核心技术:机密交易。机密交易通过Pedersen承诺和Bulletproof范围证明技术,将交易金额隐藏在承诺值中,并通过范围证明证明交易金额在一个合理的范围内。通过本文的学习,希望读者对于门罗币的隐私保护技术,以及Pedersen承诺和Bulletproof范围证明的应用有所了解。本文未对Bulletproof范围证明技术进行详细介绍,感兴趣的读者可以参考相关文献进行深入学习。
至此,我们已经对门罗币的三项核心隐私保护技术:隐形地址、环签名和机密交易进行了详细的介绍。门罗币的隐私保护技术应用基本可以分为两个阶段:
- CryptoNote2.0阶段:隐形地址、环签名等技术(2014年)
- RingCT阶段:在CryptoNote2.0基础上,优化了环签名技术,并在2017年引入机密交易技术,进一步提高交易金额的隐私性。
参考文献
- 【1】CryptoNote wiki
- 【2】Monero wiki
- 【3】Home | Monero - secure, private, untraceable
- 【4】Elliptic-curve cryptography
- 【5】CryptoNote whitepaper v2.0
- 【6】《密码学承诺原理与应用 - 概览》
- 【7】Zero-to-Monero