#ed25519 #signature #curve25519 #ecc #ed25519-key #signature-verification

已删除 solana-ed25519-dalek

ed25519-dalek 的 solana 分支;仅用于向上游提交修复

使用旧的 Rust 2015

0.2.0 2019年5月13日
0.1.0 2019年5月10日

#ed25519-key 中排名 #32

每月下载次数 29
22 个 crate 中使用(通过 solana

BSD-3-Clause

75KB
775 行代码(不包括注释)

ed25519-dalek

在 Rust 中实现 ed25519 密钥生成、签名和验证的快速且高效的 Rust 实现。

文档

文档可在此处获取 此处

基准测试

在运行于 3.30 GHz 的 Intel Skylake i9-7900X 处理器上(无 TurboBoost),此代码达到以下性能基准

!isisⒶmistakenot:(master *=)~/code/rust/ed25519-dalek ∴ cargo bench
   Compiling ed25519-dalek v0.7.0 (file:///home/isis/code/rust/ed25519-dalek)
    Finished release [optimized] target(s) in 3.11s
      Running target/release/deps/ed25519_benchmarks-721332beed423bce

Ed25519 signing                     time:   [15.617 us 15.630 us 15.647 us]
Ed25519 signature verification      time:   [45.930 us 45.968 us 46.011 us]
Ed25519 keypair generation          time:   [15.440 us 15.465 us 15.492 us]

通过启用 avx2 后端(在兼容的微架构的机器上),签名验证的性能得到了极大提升

!isisⒶmistakenot:(master *=)~/code/rust/ed25519-dalek ∴ export RUSTFLAGS=-Ctarget_cpu=native
∃!isisⒶmistakenot:(master *=)~/code/rust/ed25519-dalek ∴ cargo bench --features=avx2_backend
   Compiling ed25519-dalek v0.7.0 (file:///home/isis/code/rust/ed25519-dalek)
    Finished release [optimized] target(s) in 4.28s
      Running target/release/deps/ed25519_benchmarks-e4866664de39c84d
Ed25519 signing                     time:   [15.923 us 15.945 us 15.967 us]
Ed25519 signature verification      time:   [33.382 us 33.411 us 33.445 us]
Ed25519 keypair generation          time:   [15.246 us 15.260 us 15.275 us]

相比之下,Golang 中的等效包性能如下

!isisⒶmistakenot:(master *=)~/code/go/src/github.com/agl/ed25519 ∴ go test -bench .
BenchmarkKeyGeneration     30000             47007 ns/op
BenchmarkSigning           30000             48820 ns/op
BenchmarkVerification      10000            119701 ns/op
ok      github.com/agl/ed25519  5.775s

将密钥生成和签名速度提高约 2 倍,验证速度提高 2.5-3 倍(取决于 avx2 的可用性)。当然,这只是我的机器,这些结果——远非严谨——应该以少量盐分对待。

将其转换为粗略的周期数:我们在 3300 MHz 的 CPU 上将纳秒转换为每秒周期数时乘以 3.3 的因子,验证为 110256 个周期,签名为 52618 个周期,这与手动优化的汇编实现具有竞争力。

此外,如果您使用的是 rand crate 中的 CSPRNG,则 nightly 功能将启用那里的 u128/i128 功能,从而可能提高性能。

如果您的协议或应用程序能够批量签名进行验证,则 verify_batch() 函数的性能得到了显著提升。在上述英特尔Skylake i9-7900X上,验证96个签名需要1.7673毫秒。这是每个签名验证18.4094微秒,大约60750个周期,比原始论文中给出的批量验证速度快了一倍以上(这很可能不是一个公平的比较,因为那是Nehalem机器)。测试名称中 / 之后的数字指的是批量的大小

!isisⒶmistakenot:(master *=)~/code/rust/ed25519-dalek ∴ export RUSTFLAGS=-Ctarget_cpu=native
∃!isisⒶmistakenot:(master *=)~/code/rust/ed25519-dalek ∴ cargo bench --features=avx2_backend batch
   Compiling ed25519-dalek v0.8.0 (file:///home/isis/code/rust/ed25519-dalek)
    Finished release [optimized] target(s) in 34.16s
      Running target/release/deps/ed25519_benchmarks-cf0daf7d68fc71b6
Ed25519 batch signature verification/4   time:   [105.20 us 106.04 us 106.99 us]
Ed25519 batch signature verification/8   time:   [178.66 us 179.01 us 179.39 us]
Ed25519 batch signature verification/16  time:   [325.65 us 326.67 us 327.90 us]
Ed25519 batch signature verification/32  time:   [617.96 us 620.74 us 624.12 us]
Ed25519 batch signature verification/64  time:   [1.1862 ms 1.1900 ms 1.1943 ms]
Ed25519 batch signature verification/96  time:   [1.7611 ms 1.7673 ms 1.7742 ms]
Ed25519 batch signature verification/128 time:   [2.3320 ms 2.3376 ms 2.3446 ms]
Ed25519 batch signature verification/256 time:   [5.0124 ms 5.0290 ms 5.0491 ms]

如您所见,每个机器都有一个最佳批量大小,因此您可能希望在自己的目标CPU上运行基准测试以发现最佳大小。对于这台机器,大约每批100个签名是最佳选择

此外,得益于Rust,此实现既具有类型安全,也具有内存安全。它比那些能读懂qhasm的人更容易被更多的人阅读,使其更容易审计。我们认为,最终,这些特性——结合速度——比仅仅周期计数更有价值。

关于签名可变形性的说明

此库生成的签名是可变形的,如原文档 中所讨论的

我们可以通过乘以曲线共因子来消除可变形属性,但这会使我们的实现不匹配现有其他任何实现的行为。截至本文写作时,RFC 8032,“爱德华曲线数字签名算法(EdDSA)”,建议进行更强的检查。虽然我们同意应该进行更强的检查,但我们认为不应该在十年后更改“ed25519验证”的定义,从而与所有其他实现不兼容。

简而言之,如果可变形签名对您的协议有害,则不要使用它们。考虑使用基于curve25519的可验证随机函数(VRF),如Trevor Perrin的VXEdDSA。我们计划最终在curve25519-dalek中支持VXEdDSA。

安装

要安装,请将以下内容添加到您的项目的 Cargo.toml

[dependencies.ed25519-dalek]
version = "1"

然后,在您的库或可执行源代码中添加

extern crate ed25519_dalek;

功能

要使您的应用程序默认启用夜间功能构建 ed25519-dalek,则执行以下操作

[dependencies.ed25519-dalek]
version = "1"
features = ["nightly"]

要使您的应用程序在有人使用 cargo build --features="nightly" 构建时启用夜间功能,请将以下内容添加到 Cargo.toml

[features]
nightly = ["ed25519-dalek/nightly"]

要启用 serde 支持,请使用以下方式构建 ed25519-dalek

[dependencies.ed25519-dalek]
version = "1"
features = ["serde"]

默认情况下,ed25519-dalek 会与 curve25519-daleku64_backend 功能一起构建,该功能使用 Rust 的 i128 功能,其速度大约是 u32_backend 功能的两倍。然而,当针对 32 位系统时,你可能需要使用以下命令进行编译:cargo build --no-default-features --features="u32_backend"。如果你正在为具有 avx2 指令的机器构建,还有实验性的 avx2_backend。要使用它,请使用以下命令编译:RUSTFLAGS="-C target_cpu=native" cargo build --no-default-features --features="avx2_backend"

依赖关系

约 3MB
约 59K SLoC