7 个不稳定版本

0.4.0 2020年7月28日
0.3.2 2019年7月25日
0.3.1 2019年4月1日
0.3.0 2018年12月18日
0.0.0 2018年8月5日

#1019 in 加密学

Download history 211/week @ 2024-03-12 286/week @ 2024-03-19 225/week @ 2024-03-26 640/week @ 2024-04-02 164/week @ 2024-04-09 153/week @ 2024-04-16 208/week @ 2024-04-23 143/week @ 2024-04-30 134/week @ 2024-05-07 159/week @ 2024-05-14 188/week @ 2024-05-21 170/week @ 2024-05-28 124/week @ 2024-06-04 108/week @ 2024-06-11 182/week @ 2024-06-18 128/week @ 2024-06-25

571 每月下载量
用于 48 个 crate(18 个直接使用)

MIT/Apache

130KB
2.5K SLoC

threshold_crypto

crates.io Documentation Build Status

基于配对的阈值密码系统,用于协作解密和签名。

“threshold_crypto” crate 提供了用于签名和加密消息的加密密钥方法,以及用于阈值签名和阈值加密的密钥集。

阈值签名方案在 Alexandra Boldyreva 的文章《Threshold Signatures, Multisignatures and Blind Signatures Based on the Gap-Diffie-Hellman-Group Signature Scheme》中描述,该文章扩展了 Boneh-Lynn-Shacham 签名到阈值设置。消息加密使用 Baek 和 Zhang 的方案。我们的实现基于 pairing 椭圆曲线库。

在网络环境中,消息将被签名和加密,密钥和签名份额将分发给网络参与者。只有当至少 threshold + 1 个节点合作时,才能解密和验证消息。

安全审计

由 Jean-Philippe Aumasson 完成对 threshold_crypto 的官方安全审计。未发现可利用的安全问题,并解决了潜在的改进。审计中提到的过时依赖已在提交 54026f5 中更新。

使用方法

Cargo.toml:

[dependencies]
threshold_crypto = { version = "0.4", git = "https://github.com/poanetwork/threshold_crypto" }

main.rs:

extern crate rand;
extern crate threshold_crypto;

use threshold_crypto::SecretKey;

/// Very basic secret key usage.
fn main() {
    let sk0 = SecretKey::random();
    let sk1 = SecretKey::random();

    let pk0 = sk0.public_key();

    let msg0 = b"Real news";
    let msg1 = b"Fake news";

    assert!(pk0.verify(&sk0.sign(msg0), msg0));
    assert!(!pk0.verify(&sk1.sign(msg0), msg0)); // Wrong key.
    assert!(!pk0.verify(&sk0.sign(msg1), msg0)); // Wrong message.
}

测试

使用以下命令运行测试

$ cargo test

示例

使用以下命令从examples目录中运行示例:

$ cargo run --example <example name>

请参阅分布式密钥生成测试。

应用详情

基本使用流程如下

  • 选择一个阈值值 t
  • 创建一个密钥集
  • N 个密钥份额分配给参与者
  • 发布公共主密钥

现在第三方可以向公共主密钥和任何一组 t + 1 参与者加密信息(但不少于!)。任何一组 t + 1 参与者可以协作解密。此外,任何一组 t + 1 参与者可以协作签名信息,生成一个可以用公共主密钥验证的签名。

在此系统中,签名是唯一的,且与产生它的参与者集合无关。如果 S1S2 是由两组不同的 t + 1 秘密密钥份额持有者产生的相同信息的签名,这两个签名都将有效且相等。这在某些应用中很有用,例如,消息签名可以作为在 t + 1 参与者同意透露之前无人知晓的伪随机数。

在 simplest 形式下,threshold_crypto 需要 trusted dealer 生成并分配秘密密钥份额。然而,密钥可以生成,使得只有相应的参与者知道其秘密。此 crate 包含了实现此类 分布式密钥生成 方案的基本工具。

此库的主要应用场景是在一个必须容忍多达 t 个敌对(恶意或故障)节点的分布式网络中。由于需要 t + 1 个节点签名或透露信息,因此第三方可以相信消息代表了网络的共识。

文档

性能

基准测试功能保存在 benches 目录。您可以使用以下命令运行基准测试:

$ RUSTFLAGS="-C target_cpu=native" cargo bench

我们使用 criterion 基准测试库。

模拟密码学

为了加快依赖于 threshold_crypto 的 crate 的自动测试,提供了 use-insecure-test-only-mock-crypto 功能。 激活此功能将有效地禁用加密,并且仅在测试期间使用!基本上,底层的椭圆曲线将被小的有限域所取代,从而在执行中实现 10-200 倍的速度提升。生成的密钥可以轻易被破解,并且绝对不应该在生产环境中使用。

许可

根据您的要求,许可协议为以下之一:

任选其一。

贡献

有关贡献、测试和拉取请求协议,请参阅CONTRIBUTING 文档。

除非您明确声明,否则根据Apache-2.0许可证定义,您提交以包含在作品中的任何贡献,将双重许可,如上所述,无需任何附加条款或条件。

依赖项

~3.5MB
~71K SLoC