摘要
本文档描述了一种与格密码学兼容的分层确定性钱包方案。
动机
分层确定性钱包已成为区块链中的事实标准。随着区块链行业讨论后量子时代,我们希望在格密码学环境中应用这种技术,因为备份单个助记词来生成无限数量先前未连接的密钥,对用户来说比每次执行操作都备份相同的钱包更加可取。
我们专注于Dilithium签名方案,因为它是第一个最终确定的NIST后量子签名,并可能成为行业标准。
将格密码学调整到分层确定性设置的挑战是双重的。首先,HMAC-SHA512的输出不能直接用作格私钥。对于Falcon和Dilithium,我们需要形成格的"好基础"(小向量)的多项式,而密钥生成算法使用拒绝采样,这不适合分层确定性钱包方案而不经过修改。
第二个挑战是,在BIP32中,非强化密钥是通过椭圆曲线点(公钥)的加法派生的,而格中没有等效的操作:格公钥集在加法或乘法下不是封闭的。
我们在这个QIP中解决第一个挑战,并且不尝试支持非强化密钥。据我们所知,在格密码学环境中是否可以克服第二个挑战仍是一个开放的研究问题。非强化密钥用于仅监视或审计钱包,对分层确定性钱包的主要用途并非必不可少,因此我们不认为这是一个关键缺陷。
规范
基本思想是在每次迭代中使用HMAC的熵输出作为多项式采样的随机数生成器。在BIP32中,HMAC输出的一半被用作私钥,在"强化"情况下直接使用,或在"非强化"情况下添加到先前的私钥。这是因为椭圆曲线密码算法的结构,其中私钥可以被视为在椭圆曲线群中乘以生成点的整数。
在Falcon和Dilithium中,密钥生成算法在密钥派生过程中消耗≤64字节的熵。我们可以简单地将HMAC的整个输出输入密钥生成过程,而不是使用一半作为私钥本身,但为了最大限度地与BIP44钱包兼容,我们只使用一半输出。这使得该方案与BIP32中的强化密钥派生相同。
使用种子作为默认密钥格式的这种技术得到了NIST的支持。
参考实现
格分层确定性钱包的实现位于此处。我们针对由pq-crystals生成的测试向量进行测试,该测试向量是标准作者用C语言编写的Dilithium的参考实现。
两个钱包版本都使用Rust库bip39从助记词"助记词"获取"种子"。然后,我们通过HMAC-SHA512从种子派生"主密钥",它形成密钥树的根,每个边缘表示HMAC-SHA512(R || 0x00 || L || 子索引),其中L || R是树中父节点的拆分值,如BIP32标准所述。
原理
我们最初考虑使用Falcon,因为它具有更小的密钥和签名。为此,我们依赖Thomas Pornin的rust-fn-dsa实现FALCON签名算法,并进行了一些小的修改以允许外部生成的熵。Thomas Pornin是FALCON标准的作者之一,也是算法的PQClean C语言实现的作者。Falcon钱包的实现位于此处。
后来我们得知(来自Thomas Pornin)Falcon标准并未完全指定密钥生成路径,因此我们决定切换到ml-dsa(原名Dilithium)。Dilithium有几个优点。它是
- 更简单
- 更快
- 具有确定性密钥生成
- 已被NIST最终确定
缺点是更大的密钥、更大的签名和更慢的验证。
无论如何,格密钥和签名都比椭圆曲线大得多,所以我们将不得不为更多磁盘空间付费。
Dilithium和Falcon都需要≤64字节的熵作为密钥生成过程的输入,因此我们可以简单地使用HMAC-SHA512输出的前32字节作为熵源。非强化用例在格密码学中显然是不可实现的,因此我们省略了它。
关于HMAC-SHA512的量子安全性,针对哈希函数的主要量子攻击是Grover算法,它对搜索未排序数据库(在我们的情况下是哈希前像)提供二次加速。这将安全位数减半,即512 → 256,256 → 128等。这适用于所有哈希函数,因此任何经典安全的哈希算法都会有相同的问题。另一方面,已经证明Grover算法在渐近意义上是最优的,所以我们不应期望另一种量子算法对安全哈希函数的攻击会比Grover算法好多少。
与哈希函数相比,区块链的数字签名更容易受到量子攻击,因为Shor算法将从公钥找到椭圆曲线私钥的难度从指数级(Pollard's rho)降低到多对数级O(log^3(n)),其中n是比特数。
出于这个原因,我们优先考虑保护数字签名免受量子攻击,并保持哈希函数不变。
版权
本规范已发布到公共领域。
请参阅此图表以了解BIP32的摘要。
本提案最初作为Quantus改进提案发布于此处




