没有项目描述

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-daleku64_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"

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在sqlite数据库中保存特定列的历史记录   java如何更改/更新timeseriechart名称(JFreeChart)   java如何将整数转换为可绘制的   汇编什么解释Java的字节码   java查找已编译的类版本号   我应该什么时候在ColdFusion应用程序中使用Java?   java当一个实体的两个字段为(unique=true)时,如何处理JPA异常?   java为什么在所有其他实例都正确的情况下返回错误的布尔值?   java Hibernate每次都准备语句   java停留在平均字长上   对Java和日语字符进行编码   java如何将导致异常的方法的错误消息传递给侦听器中的onTestFailure方法   java代码没有打印结果   java为什么私有内部接口的方法必须是公共的?   休眠发生错误。有关详细信息,请参阅错误日志。JAVAlang.NullPointerException