MystenLabs/fastcrypto

GitHub: MystenLabs/fastcrypto

fastcrypto 是一个为区块链等高性能系统设计的 Rust 密码学库,提供安全高效的签名、验证及高级密码学功能。

Stars: 308 | Forks: 171

# fastcrypto [![crate](https://buildstats.info/crate/fastcrypto)][crate-link] [![文档](https://docs.rs/fastcrypto/badge.svg)][docs-link] [![构建状态](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8e72a160a2073527.svg)](https://github.com/MystenLabs/fastcrypto/actions) [![更新 Sui 的 fastcrypto 指针](https://github.com/MystenLabs/sui/actions/workflows/fastcrypto_pull.yml/badge.svg)](https://github.com/MystenLabs/sui/actions/workflows/fastcrypto_pull.yml) ![Apache2/MIT 许可证](https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg) ![Rust 版本](https://img.shields.io/badge/rustc-1.63+-blue.svg) [![codecov](https://codecov.io/gh/MystenLabs/fastcrypto/branch/main/graph/badge.svg?token=zlB0v8k4O5)](https://codecov.io/gh/MystenLabs/fastcrypto)

`fastcrypto` 是 Mysten Labs 软件中使用的通用密码学库。它包含三个独立的 crate:`fastcrypto`、`fastcrypto-zkp` 和 `fastcrypto-cli`。它们作为独立 crate 发布,以鼓励跨不同应用和领域的重用。 `fastcrypto` 是一个围绕若干精心挑选的 crate 构建的封装库,选择时考虑了以下因素: - **安全性**:这些库是否存在已知的攻击向量或可能的误用漏洞。 - **性能**:在经过广泛基准测试后,该 crate 是否能高速执行密码学操作。这对于 Sui 网络在签名和验证大量交易与证书时保持高性能至关重要。 - **确定性**:签名是否不可篡改。 - **普及度**:该库是否被其他共识关键系统使用。 此外,我们为所选库扩展了额外功能: - **健壮的测试框架**:尽可能添加了 [Wycheproof 测试](https://github.com/google/wycheproof)和 [prop 测试](https://altsysrq.github.io/proptest-book/intro.html),以防御任意输入和精心构造的边缘情况。 - **零化**:使用 [zeroize](https://docs.rs/zeroize/latest/zeroize/) trait,在敏感的私钥材料超出作用域时将其从内存中清除。请注意,这是*尽力而为*,并不能保证所有敏感数据都从内存中清除,因为数据可能被编译器、FFI 等复制或移动。 - **序列化**:需要高效且标准化的序列化。 本库将根据基准测试结果、RFC 更新、新研究和审计输入,持续更新更多方案和更快的实现。 `fastcrypto` crate 包含: - **Traits**:应由代表数字密码材料的具体类型实现的 traits。 - [`SigningKey`]: 由私钥实现的 trait,具有其公钥和签名的关联类型。 - [`VerifyingKey`]: 由公钥实现的 trait,具有其私钥和签名的关联类型。它还包含批量验证的默认实现,空批次验证会失败。 - [`Authenticator`]: 由签名实现的 trait,具有其公钥和私钥的关联类型。 - [`AggregateAuthenticator`]: 由聚合签名实现的 trait,允许向聚合签名添加签名,并使用相应的消息对公钥进行验证。 - [`KeyPair`]: 表示公私钥对的 trait,包含常用的获取私钥/公钥函数以及一个使用种子随机性的密钥对生成函数。 - [`ToFromBytes`]: 旨在最小化获取可序列化密钥所需步骤数的 trait。 - [`EncodeDecodeBase64`]: 扩展了 `ToFromBytes` 的 trait,用于与 Base64 字符串的直接转换。这是存储密码材料的格式。 - **具体签名方案**:实现密码学敏捷性所需推荐 traits 的具体签名方案类型。 - Ed25519: 基于 [`ed25519-consensus`](https://github.com/penumbra-zone/ed25519-consensus) crate。符合 [ZIP-215](https://zips.z.cash/zip-0215),该规范定义了 RFC8032 缺少但对共识算法至关重要的签名有效性。 [`ed25519-dalek`](https://github.com/dalek-cryptography/ed25519-dalek) 因最近发现的 [Chalkias 双公钥 API 漏洞](https://github.com/MystenLabs/ed25519-unsafe-libs) 而被完全弃用。 - Secp256k1: 在 secp256k1 曲线上的 ECDSA 签名。基于 [Secp256k1 FFI](https://crates.io/crates/secp256k1/0.23.1) 封装,该封装绑定到 C 库,提供比原生 Rust 实现 [k256](https://crates.io/crates/k256) 库快约 30% 的验证性能。可生成标准 ECDSA 签名或 65 字节可恢复签名,形状为 [r, s, v],其中 v 可以是 0 或 1,代表恢复 ID。使用根据 [RFC6979](https://www.rfc-editor.org/rfc/rfc6979) 的伪随机确定性 nonce 生成来产生确定性签名,无需为 nonce 保护生成随机数。使用 sha256 作为签名和验证的默认哈希函数。提供 `verify_hashed` 接口,用于接受预哈希消息及其签名进行验证。支持通过提供 Secp256k1 可恢复签名和相应的预哈希消息来恢复公钥。接受的签名必须将其 `s` 保持在曲线阶数的下半部分。如果 s 过高,则将 `s` 规范化为 `order - s`,其中曲线阶数为 `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141`。更多内容参见 [BIP-0062](https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki#low-s-values-in-signatures)。 - Secp256r1: 在 secp256r1 曲线上的 ECDSA 签名,基于 [`p256`](https://crates.io/crates/p256) crate,该 crate 是 Secp256r1(又名 [NIST P-256](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf) 和 prime256v1)曲线的纯 Rust 实现。扩展了 `p256` 的功能,因此除了标准 ECDSA 签名外,我们的实现还可以生成和验证 65 字节的可恢复签名,形式为 [r, s, v],其中 v 是恢复 ID。使用根据 [RFC6979](https://www.rfc-editor.org/rfc/rfc6979) 的伪随机确定性 nonce 生成来确定性地生成签名,无需为 nonce 保护生成随机数。使用 sha256 作为签名和验证的默认哈希函数。支持通过提供 Secp256r1 ECDSA 可恢复签名和相应的预哈希消息来恢复公钥。接受的签名必须将其 `s` 保持在曲线阶数的下半部分。如果 s 过高,则将 `s` 规范化为 `order - s`,其中曲线阶数为 `0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551`,定义见 [此处](https://secg.org/SEC2-Ver-1.0.pdf)。 - BLS12-381: 基于用汇编和 C 语言编写、针对性能和安全进行优化的 [`blst`](https://github.com/supranational/blst) crate。G1 和 G2 点遵循 [ZCash 规范](https://github.com/supranational/blst#serialization-format) 以压缩格式序列化。提供用于在 G2 组的公钥上验证 G1 组签名(最小签名)或反之(最小公钥)的功能。提供聚合签名和快速验证聚合签名的功能,其中假定公钥已通过持有证明验证。 - RSA: 基于 crate [rsa](https://crates.io/crates/rsa)。 提供根据 [RFC 8017](https://www.rfc-editor.org/rfc/rfc8017) 进行 RSA 签名和验证的功能。 - **密码学原语的实用函数**。其中一些是 Sui 中 Move 智能合约 API 的 Rust 实现。 - HKDF: 一种基于 HMAC 的密钥派生函数,基于 [RFC-5869](https://tools.ietf.org/html/rfc5869),用于为给定的密钥对使用盐和可选的域派生密钥对。这需要选择一个 HMAC 函数,该函数精确扩展到所选 KeyPair 参数的私钥字节长度。 - Pedersen 承诺:使用一个值和一个盲化因子创建 Pedersen 承诺的函数。添加或减去代表 Pedersen 承诺的 Ristretto 点。 - Bulletproofs 范围证明:证明一个承诺的值是一个无符号整数,位于 `[0, 2^bits)` 范围内。验证某个值具有无符号位长度、该值是 `[0, 2^bits)` 范围内整数的 Pedersen 承诺的函数。 - 椭圆曲线 VRF (ECVRF): 使用 Ristretto255 群的可验证随机函数实现。根据给定输入创建证明和根据给定输出验证证明的函数,基于 [draft-irtf-cfrg-vrf-15](https://datatracker.ietf.org/doc/draft-irtf-cfrg-vrf/) 规范。 - 编码:Base64 和 Hex 定义了具有自定义序列化和验证的编码 trait,基于 [base64ct](https://crates.io/crates/base64ct) 和 [hex]((https://crates.io/crates/base64ct)。值得注意的是,选择了 base64ct crate 而非最流行的 base64 Rust crate,因为 (a) 它是恒定时间的,并且 (b) 明确拒绝损坏的编码以防止解码时的可篡改攻击,参见 [论文](https://dl.acm.org/doi/10.1145/3488932.3527284) 的深入分析。 - 哈希函数封装:[SHA2_256](https://en.wikipedia.org/wiki/SHA-2)(256 位摘要)、[SHA3_256](https://en.wikipedia.org/wiki/SHA-3)(256 位摘要)、[SHA2_512](https://en.wikipedia.org/wiki/SHA-2)(512 位摘要)、[SHA3_512](https://en.wikipedia.org/wiki/SHA-3)(512 位摘要)、[KECCAK](https://keccak.team/files/Keccak-reference-3.0.pdf)(256 位摘要)、[BLAKE2-256](https://en.wikipedia.org/wiki/BLAKE_(hash_function)#BLAKE2)(256 位摘要)。 - 多集哈希:一种哈希函数,其输出是椭圆曲线上的一个点。它还允许高效计算两个多集并集的哈希。 - 提供了一个用于测试和基准测试的异步签名服务。 `fastcryto-zkp` crate 包含用于验证 Groth16 证明及其准备好的验证密钥和公共输入的 API。支持 BN254 和 BLS12381 曲线。验证器基于 [Arkworks](https://github.com/arkworks-rs/) 和 [`blst`](https://github.com/supranational/blst) 库。 `fastcrypto-cli` crate 包含可用于调试的 CLI 工具。使用 `-h` 标志查看用法。 ``` $ cargo build --bin encode-cli $ target/debug/encode-cli -h $ cargo build --bin sigs-cli $ target/debug/sigs-cli -h $ cargo build --bin ecvrf-cli $ target/debug/ecvrf-cli -h ``` ## WASM `fastcrypto` crate 可用于构建 WASM 模块。为此,请在 `Cargo.toml` 文件中包含 `fastcrypto` crate 时启用 `wasm` feature 标志,并遵循 [Rust 和 WASM 书籍](https://rustwasm.github.io/docs/book/) 中的说明来构建 WASM 模块。 ## 测试 所有三个 crate 中的所有原语都存在单元测试,可以通过以下方式运行: ``` $ cargo test ``` ## 基准测试 在 `fastcrypto` 中,可以通过运行以下命令比较所有当前实现的签名方案的*签名、验证、批量验证*和*密钥生成*: ``` $ cargo bench ``` 每次发布都会生成一份[基准测试报告](https://mystenlabs.github.io/fastcrypto/benchmarks/criterion/reports/),便于轻松比较 `fastcrypto` 中可用的不同密码学原语和方案的性能。例如,截至修订版 [dd5adb](https://github.com/MystenLabs/fastcrypto/commit/dd5adb669b895785d3f34abc562fca26c943154a),我们得到 `fastcrypto` 中不同方案的签名和验证计时如下: ![签名方案对比。](https://github.com/MystenLabs/fastcrypto/blob/plots/signatures-dd5adb.svg) 下面是使用基准测试报告数据制作的另一个图表,显示了所有签名都在同一消息上的批量签名验证基准: ![所有签名都在同一消息上的批量签名验证。](https://github.com/MystenLabs/fastcrypto/blob/plots/batch-dd5adb.svg) 在 `fastcrypto-zkp` 中,可以运行从 Arkworks 到 `blst` 表示的域元素基准测试,以及在 BN254 和 BLS12381 上验证 Groth16: ``` $ cd fastcrypto-zkp/ $ cargo bench ``` ## 许可证 所有 crate 均在以下许可证之一下授权: * [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) * [MIT license](http://opensource.org/licenses/MIT)
标签:CVE, Mysten Labs, Rust 库, Sui 网络, 内存安全, 分布式系统, 加密算法, 区块链, 可视化界面, 响应大小分析, 安全测试, 密码学, 密码工具, 快速加密, 性能优化, 手动系统调用, 攻击性安全, 数字签名, 检测绕过, 测试框架, 软件开发, 通知系统, 零知识证明