#blake3 #curve25519 #signature #schnorr-signature

c255b3

基于 Curve25519 和 Blake3 的 Schorr 签名

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 签名 的实现,它基于 Curve25519Blake3

请注意,这种特定的公式已被弃用。它作为 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。这产生了我们的签名,它是es的元组。

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