4个版本 (2个重大更新)
0.3.0 | 2023年9月15日 |
---|---|
0.2.0 | 2023年9月6日 |
0.1.1 | 2023年9月1日 |
0.1.0 | 2023年5月27日 |
#1579 in 密码学
每月30次下载
31KB
474 行
r255b3: 使用ristretto255和blake3的schnorr签名。
此crate提供基于Schnorr签名的短签名,基于Ristretto255和Blake3。
注意:这不是Ed25519,如果您想使用Ed25519,请使用优秀的ed25519-dalek crate。
警告!这是一个稍微新颖的密码学原语。它尚未经过审计!请在自己的(而非他人的)风险下使用!
API和密码学构造可能会根据审计结果而更改,但从版本0.3.0开始可能被认为是相对稳定的。
为什么?
最初的动机是为converge的嵌入式版本提供最小的占用空间。它已经广泛使用了Blake3哈希函数,为了Ed25519签名而将其更改为SHA512也不是什么大问题。
话虽如此,它相对于Ed25519还有一些其他优点
- 使用Schnorr签名公式的更小的密钥。
- 对领域分隔的正确(并强制执行的)支持。
- 明确定义的密钥,公钥或签名中没有可变因素。
- 默认模式支持流式处理,并且可以单次传递签名数据。
- 使用更快的哈希函数,对于大输入更快。
如何?
Schnorr签名方案已经积累了多种变化,这个方案
- 提供了内置的领域分隔
- 使用标量作为密钥和群生成器乘以该标量作为公钥
- 使用小的标量、大的标量元组作为签名
- 从领域、消息、密钥和公钥中派生一个确定的随机nonce
- 将公钥混合到消息哈希中
密钥生成
r255b3使用Ristretto255标量作为密钥。这些是通过采样256位的安全随机数然后通过群阶进行约简生成的。这个群阶是 相对 略微大于2²⁵²,这限制了与均匀分布的总偏差约为2⁻¹²⁶。
sk ←ᴿ Scalars
pk := sk*B
消息哈希准备
我们首先使用Blake3的上下文哈希从领域派生一个密钥哈希
hk := Blake3Ctx("Schnorr-Ristretto255-Blake3", domain)
签名
接下来,我们生成一个标量nonce,k
,要么通过采样随机值,要么确定性地生成
k := Blake3Keyed(hk, message || "Secret Nonce for Schnorr-Ristretto255-Blake3" || sk || pk)
现在,k
将生成器缩放以获取 Ristretto255 点 r
。 r
被压缩,与消息和公钥连接,然后输入到 Blake3 中以派生短标量 e
。
r = k*B
e = Blake3(hk, message || "Message Hash for Schnorr-Ristretto255-Blake3" || pk || r)
这里的 e
是哈希的前 128 位,后 128 位被丢弃。
请注意,k
和 e
的哈希共享一个公共前缀,这使我们能够在将上下文字符串、密钥和点用于哈希之前复制哈希状态。
最后,我们将 e
与秘密密钥相乘,并从 k
中减去它们的乘积,得到(完整大小)标量 s
。这产生了我们的签名,它是 e
和 s
的元组。
s = k - sk * e
sig = (e, s)
e
是 16 字节,而 s
是 32 字节,结果是一个 48 字节的签名。
验证
验证过程是通过重构 r
来进行的。
rᵥ = s*B + e*pk = (k - sk*e)*B + (e*sk*B) = k*B - sk*e*B + e*sk*B = k*B
现在我们有了 rᵥ
,我们使用与签名时完全相同的方式使用我们的带密钥的 Blake3 哈希消息。这产生了 e
的另一个副本,我们称之为 eᵥ
。
eᵥ = Blake3(hk, message || "Message Hash for Schnorr-Ristretto255-Blake3" || pk || r)
最后,我们可以将 eᵥ
与签名中的 e
进行比较,如果它们匹配,则我们有一个有效的签名。
测试向量
秘密密钥:“Did gyre and gimble in the wabe\n” 公钥:161bf5685cfbb674ad88dbbb266e15ec5aa93406135ec471704acb79cd246564 在域:“All mimsy were the borogroves,” 在消息:“And the mome raths outgrabe” 签名:9028a67bf5ca00771b15ab30535bba69d4991415d864503cd87e589712d0e0186d4c03629416d51e639817ba9009520c
许可证
本项目奉献给公共领域,有关详细信息,请参阅 UNLICENSE。
依赖项
~2.8–4MB
~95K SLoC