3 个版本
0.0.3 | 2023年5月27日 |
---|---|
0.0.2 | 2023年4月14日 |
0.0.1 | 2023年4月13日 |
#2094 in 加密学
29 每月下载量
21KB
290 行
c255b3: 使用 curve25519 和 blake3 的 schnorr 签名。
这个 crate 提供了基于 Schnorr 签名 的实现,它基于 Curve25519 和 Blake3。
请注意,这种特定的公式已被弃用。它作为 r255b3 存活下来,基于 ristretto255 和 blake3,以获得更清晰的定义和更快的公钥解析。
注意:这不是 Ed25519,如果您需要 Ed25519,请使用优秀的 ed25519-dalek crate。
警告!这是一个已弃用的加密原语。它尚未经过审计。请自行承担风险!
为什么?
最初的动机是为 converge 的嵌入式版本做准备。我们已经在批量数据中使用了 Blake3 哈希函数,而只为 Ed25519 签名添加 SHA512 真的是不必要的。
话虽如此,还有其他好处
- 签名应用特定的域分离
- 支持使用应用程序提供的随机数进行非确定性签名
- 明确定义的密钥和公钥
- 一个 非常快 的哈希函数
如何实现?
大多数参数化都是直接的。但是有两个小的偏差
- 使用 Blake3 的密钥版本提供域分离。
- 默认情况下,随机数
k
是确定的,它是私钥和消息的 Blake3 哈希值,并使用域进行密钥化。
密钥生成
c255b3 使用 255 位(减去 19 个值)的密钥。与 Ed25519 不同,它不需要 限制,尽管为了与 X25519 重复使用密钥,必须清除低三位。密钥 sk
可以简单地生成 256 个随机位,并模减基点阶(略大于 2²⁵²)。
签名
第一步是生成标量随机数 k
。这可以通过随机数生成器完成,或者通过取私钥和消息的连接后的 Blake3 哈希(使用域进行密钥化)来完成。
k = Blake3(domain, sk | message)
现在 k
乘以基点得到点 r
,我们将在验证时恢复它。 r
被压缩,与消息连接,并输入到 Blake2 中,用于导出标量 e
。
r = k*B
e = Blake3(domain, r | message)
最后,我们将e
和密钥相乘,从k
中减去它们的乘积,得到标量s
。这产生了我们的签名,它是e
和s
的元组。
s = k - sk * e
sig = (e, s)
验证
为了验证,我们需要公钥,这是通过将基点乘以私钥得到的。
pk = sk*B
然后我们取出我们的签名并重构r
,称之为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(domain, rᵥ | message)
最后,我们可以将eᵥ
与签名中的e
进行比较,如果它们匹配,我们就有了一个有效的签名。
许可证
本项目属于公共领域,详情请参阅UNLICENSE。
依赖关系
约2.5-3.5MB
约81K SLoC