Skip to main content

未提供项目描述

项目描述

ed25519-dalek(NEM 实施)

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

文档

文档可在此处获得。

基准

在以 3.30 GHz 运行的英特尔 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

根据 avx2 的可用性,使密钥生成和签名平均速度提高 2 倍,验证速度提高 2.5-3 倍。当然,这只是我的机器,这些结果——远非严格——应该用一把盐来衡量。

转换为粗略的周期计数:我们乘以 3.3 以将纳秒转换为 3300 Mhz CPU 上的每秒周期数,即 110256 个周期用于验证和 52618 个用于签名,这与手动优化的组装实现相比具有竞争力。

此外,如果您使用randcrate 中的 CSPRNG,该nightly 功能将在此处启用u128/i128功能,从而可能提高性能。

如果您的协议或应用程序能够批量签名进行验证,该verify_batch()功能将大大提高性能。在前面提到的 Intel Skylake i9-7900X 上,验证一批 96 个签名需要 1.7673ms。这是 18.4094us,或大约 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 = {git = "https://github.com/namuyan/ed25519-dalek"}

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

extern crate ed25519_dalek;

用于python:

pip3 install --user nem_ed25519_rust
import nem_ed25519_rust
 
# keypair generation
sec, pub = nem_ed25519_rust.generate_keypair()
print("sk", sec.hex())
print("pk", pub.hex())
 
# message signature
msg = b"hello world, rust-python combination"
sig = nem_ed25519_rust.sign(msg, sec)
print("sig", sig.hex())
nem_ed25519_rust.verify(msg, sig, pub)
 
# message encryption
sec_other, pub_other = nem_ed25519_rust.generate_keypair()
enc = nem_ed25519_rust.encrypt(sec, pub_other, msg)
print("enc", enc.hex())
dec = nem_ed25519_rust.decrypt(sec_other, pub, enc).unwrap()
print("dec", dec)

特征

要使您的应用程序在ed25519-dalek默认情况下启用夜间功能构建,请改为:

[dependencies]
ed25519-dalek = {git = "https://github.com/namuyan/ed25519-dalek", features = ["nightly"]}

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

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

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

[dependencies]
ed25519-dalek = {git = "https://github.com/namuyan/ed25519-dalek", features = ["serde"]}

默认情况下,针对' 的特性ed25519-dalek构建 ,它使用 Rust 的特性来实现大约两倍于特性的速度。但是,当面向 32 位系统时,您可能希望使用 . 如果您正在为带有 avx2 指令的机器构建,那么还有实验性的. 要使用它,请编译 curve25519-daleku64_backendi128u32_backendcargo build --no-default-features --features="u32_backend"avx2_backendRUSTFLAGS="-C target_cpu=native" cargo build --no-default-features --features="avx2_backend"

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

nem-ed25519-rust-1.0.0rc4.tar.gz (26.0 kB 查看哈希

已上传 source

内置分布

nem_ed25519_rust-1.0.0rc4-cp36-cp36m-win_amd64.whl (211.1 kB 查看哈希

已上传 cp36