没有项目描述
nem-ed25519-rust的Python项目详细描述
ED25519 Dalek(NEM实施)
ED25519密钥生成、签名和 生锈验证。
文档
文档可用here。
基准
在英特尔Skylake i9-7900x上,运行频率为3.30GHz,没有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倍,并且 根据AVX2的可用性,验证速度提高2.5-3倍。当然,这个 只是我的机器,这些结果不应该太严格 加一把盐。
转换为粗略的循环计数:我们乘以3.3的系数来转换 在3300兆赫的CPU上每秒循环数纳秒,即 验证和52618签名,与手动优化相比具有竞争力 程序集实现。
另外,如果您使用的是rand
板条箱中的csprng,则nightly
功能将在那里启用u128
/i128
功能,从而可能导致
更快的性能。
如果您的协议或应用程序能够批量签名进行验证,
verify_batch()
函数大大提高了性能。上
前面提到的Intel Skylake i9-7900x,验证一批96个签名
1.7673ms。每个签名验证18.4094us,或大约60750个周期,
比原稿批验证速度快一倍以上
(这可能不是一个公平的比较,因为那是一台尼哈勒姆机器)。
测试名称中/
后面的数字表示批次的大小:
∃!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,使它更容易被审计。我们是 最终,这些特性与速度相结合的观点 有价值的比单靠循环更重要。
关于特征可塑性的注记
此库生成的签名是可延展的,如中所述 the original paper:
我们可以通过乘以曲线来消除延展性。 然而,这将导致我们的实现not匹配 存在的每个其他实现的行为。在写这篇文章的时候, RFC 8032,“爱德华兹曲线数字” 签名算法(eddsa)建议,应该做更强的检查。 虽然我们同意应该加强检查,但我们认为 人们不应该在十年内改变“ED25519验证”的定义 之后,破坏了与其他实现的兼容性。
简言之,如果可扩展签名对您的协议不利,请不要使用它们。 考虑使用基于curve25519的可验证随机函数(vrf),例如 Trevor Perrin's VXEdDSA, 相反。我们 plan到 最终在curve25519 dalek中支持vxedsa。
安装
要安装,请将以下内容添加到项目的Cargo.toml
:
[dependencies]ed25519-dalek={git="https://github.com/namuyan/ed25519-dalek"}
然后,在库或可执行源中,添加:
externcrateed25519_dalek;
用于python:
pip3 install --user nem_ed25519_rust
importnem_ed25519_rust# keypair generationsec,pub=nem_ed25519_rust.generate_keypair()print("sk",sec.hex())print("pk",pub.hex())# message signaturemsg=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 encryptionsec_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)
功能
使您的应用程序使用nightly功能构建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"]
使能eserde支持,使用:
生成ed25519-dalek
[dependencies]ed25519-dalek={git="https://github.com/namuyan/ed25519-dalek",features=["serde"]}
默认情况下,ed25519-dalek
根据curve25519-dalek
的u64_backend
生成
特性,它使用rust的i128
特性来实现大约两倍于
u32_backend
功能。但是,当以32位系统为目标时,
可能想用
cargo build --no-default-features --features="u32_backend"
。
如果您正在为一台带有AVX2指令的机器而构建,还有
实验性的。要使用它,请使用
RUSTFLAGS="-C target_cpu=native" cargo build --no-default-features --features="avx2_backend"