rpgp/rpgp

GitHub: rpgp/rpgp

纯 Rust 实现的 OpenPGP 库,提供符合 RFC 9580 规范的低级 API,用于在应用中集成 PGP 加密、签名与密钥管理功能。

Stars: 1043 | Forks: 102

# rPGP *纯 Rust 实现的 OpenPGP,采用宽松的开源许可证* rPGP 是一个基于纯 Rust 实现的 OpenPGP 库,符合 [RFC9580] 规范。 它支持常用的 v4 格式,以及最新的 v6 密钥格式和 AEAD 加密机制。 (历史 RFC [RFC4880] 和 [RFC6637] 中指定的所有格式,包括 v3 密钥和签名,也受支持。) 有关已实现的 PGP 功能的更多详细信息,请参阅 [`IMPL_STATUS`](docs/IMPL_STATUS.md);有关这些功能的背景信息,请参阅["OpenPGP 格式与机制概述"](docs/openpgp.md)。 rPGP 提供了灵活的低级 API。它赋予用户以尽可能高的兼容性来构建更高级 PGP 工具的能力。 此外,它完全支持 [Autocrypt 1.1 邮件加密规范] 要求的所有功能。 ## 使用 rPGP 构建的知名用户与库 - [Delta Chat]:基于电子邮件运行跨平台消息应用 - [GpgFrontend]:跨平台的 OpenPGP 桌面应用,支持可选的 rPGP 后端 - [`debian-packaging`]:用于处理 Debian 软件包的库 crate - [`himalaya`]:用于管理电子邮件的 CLI(包含 [`pgp-lib`] 组件) - [`oct-git`]:Git 签名与验证后端(侧重于 OpenPGP 智能卡) - [`prs-lib`]:受 pass 启发开发的 CLI 密码管理器(支持可选的 rPGP 后端,包括对 OpenPGP 智能卡的支持) - [`rpgpie`]:实验性的 OpenPGP 语义库 - [`rpm`]:用于解析和创建 RPM 文件的纯 Rust 库 - [`rsop`]:基于 rPGP 和 rpgpie 构建的 [SOP] CLI 工具 - [`rsop-oct`]:针对 OpenPGP 智能卡设备的 [SOP] CLI 工具(同样基于 rPGP 和 rpgpie) - [`signstar`]:面向 HSM 后端的签名飞地框架 - [`voa-openpgp`]:面向 [VOA] 的 OpenPGP 实现 没有看到你的项目?欢迎提交 PR :) ## 用法 ``` > cargo add pgp ``` ### 加载公钥并验证内联签名消息 ``` use pgp::composed::{Deserializable, Message, SignedPublicKey}; fn main() -> pgp::errors::Result<()> { let (public_key, _headers_public) = SignedPublicKey:: from_armor_file("key.asc")?; let (mut msg, _headers_msg) = Message::from_armor_file("msg.asc")?; if msg.verify(&public_key).is_ok() { // Verify using the primary (NOTE: This is not always the right key!) // Signature is correct, print message payload println!("Signed message: {:?}", msg.as_data_string()?); } Ok(()) } ``` ### 使用 OpenPGP 密钥对生成并验证 detached signature ``` use pgp::composed::{Deserializable, DetachedSignature, SignedPublicKey, SignedSecretKey}; use pgp::crypto::hash::HashAlgorithm; use pgp::types::Password; fn main() -> pgp::errors::Result<()> { const DATA: &[u8] = b"Hello world!"; // Create a signature over DATA with the private key let (private_key, _headers) = SignedSecretKey::from_armor_file("key.sec.asc")?; let sig = DetachedSignature::sign_binary_data( rand::thread_rng(), &private_key.primary_key, // Sign with the primary (NOTE: This is not always the right key!) &Password::empty(), HashAlgorithm::Sha256, DATA, )?; // Verify signature with the public key let (public_key, _headers) = SignedPublicKey::from_armor_file("key.asc")?; sig.verify(&public_key, DATA)?; // Verify with primary key (NOTE: This is not always the right key!) Ok(()) } ``` ### Cargo 特性 - `bzip2`:启用 bzip2 支持 - `asm`:启用基于汇编的优化 - `wasm`:允许为 wasm 构建 - `large-rsa`:允许使用超大 RSA 密钥(将限制从 8192 位提高到 16384 位) - `malformed-artifact-compat`:对某些类型的格式错误产物保持宽容(错误构建的 ECDH PKESK;无效且过短的首个部分体分段)。大多数用户不需要此特性,默认应禁用! - `draft-pqc`:启用 draft-ietf-openpgp-pqc-12 的实现(此特性不稳定,可能在补丁版本中出现破坏性更改。请勿用于生产环境!) - `draft-wussler-openpgp-forwarding`:启用对 [draft-wussler-openpgp-forwarding](https://datatracker.ietf.org/doc/draft-wussler-openpgp-forwarding/) 格式和功能的支持 ## 当前状态 - 实现状态:[`IMPL_STATUS.md`](docs/IMPL_STATUS.md) - 安全状态:[`SECURITY_STATUS.md`](docs/SECURITY_STATUS.md) - 支持的平台:[`PLATFORMS.md`](docs/PLATFORMS.md) ## 常见问题 请参阅 [`FAQ.md`](docs/FAQ.md)。 ## rPGP 是面向应用开发者的库 rPGP 旨在让应用开发者能够轻松地将 OpenPGP 功能整合到他们的项目中。 需要注意的是,OpenPGP 的格式及其语义相对复杂。 我们推荐阅读《["面向应用开发者的 OpenPGP"](https://openpgp.dev/)》一文作为初步指导。 同时,我们也欢迎在 rPGP 的 issue 跟踪器中提问。 ## rPGP 是一个低级别的 OpenPGP 库 rPGP 提供了处理 RFC 9580 中定义的格式与机制的抽象。 然而,它们是作为相对底层的构建块提供的,rPGP 并不试图确保用户不会以不安全的方式使用它们。 正确且安全地使用 rPGP 中的构建块,需要对 OpenPGP 有扎实的理解,并且至少具备基础的密码学知识。 ### OpenPGP 是一种分层技术 作为背景信息,可以将 OpenPGP 视为一种多层技术,大致如下所示: 1. 传输格式:[数据包封装](https://www.rfc-editor.org/rfc/rfc9580.html#name-packet-syntax),[数据包内容](https://www.rfc-editor.org/rfc/rfc9580.html#name-packet-types),[ASCII armor](https://www.rfc-editor.org/rfc/rfc9580.html#name-forming-ascii-armor),... 2. 根据[语法](https://www.rfc-editor.org/rfc/rfc9580.html#name-packet-sequence-composition)构建的复合对象(例如证书、消息) 3. 处理数据的功能,例如计算和验证 OpenPGP 签名,以及消息的加密与解密。 4. OpenPGP 语义(例如:证书及其组件的*过期*与*吊销*,定义特定组件密钥可用于哪些语义操作的*Key Flags*,算法偏好的信号指示等) 在这些层中,OpenPGP RFC 定义了第 1-3 层,而第 4 层并未进行详细规定。 关于形式化 OpenPGP 语义的一些工作可以在以下文档中找到: [draft-gallagher-openpgp-signatures](https://datatracker.ietf.org/doc/draft-gallagher-openpgp-signatures/) 和 [draft-dkg-openpgp-revocation](https://datatracker.ietf.org/doc/draft-dkg-openpgp-revocation/)。 与 RFC 类似,rPGP 处理第 1-3 层,但明确不涉及第 4 层。 需要 OpenPGP 语义的应用程序必须手动实现它们,或者依赖其他库来处理该层。 注意:[`rpgpie`] 库实现了部分此类高级 OpenPGP 语义。 将其整合到 rPGP 项目中,或作为参考进行研究,可能会有所帮助。 ### OpenPGP 中的机制随时间演进 rPGP 能够处理种类繁多的 OpenPGP 产物。 它支持 OpenPGP 中的几乎所有机制,既包含现代机制,也包含目前被视为 legacy 的机制。 这明确包括了使用历史算法的产物,尽管以目前的认知来看,这些算法被认为是不安全的。 rPGP 并不保证应用开发者会针对其目的使用合适的密码学构建块 (尽管通常情况下,它默认会产生符合标准的现代产物)。 有关 OpenPGP 随时间演进的更多详细信息,请参阅["OpenPGP 格式与机制概述"](docs/openpgp.md)。 ## 最低支持的 Rust 版本 (MSRV) 本仓库中的所有 crate 均支持 Rust 1.88 或更高版本。未来对最低支持的 Rust 版本的变更将会通过提升次版本号来进行。 ## 资金赞助 [RFC 9580 support for rPGP](https://nlnet.nl/project/rPGP-cryptorefresh/) 部分资金由 [NGI0 Core](https://nlnet.nl/core/) 赞助, 该基金由 [NLnet](https://nlnet.nl) 设立, 并获得了欧盟委员会 [Next Generation Internet](https://ngi.eu) 计划的财务支持。 ## 许可协议 本项目基于以下任一许可协议授权: * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) 或 ) * MIT 许可协议 ([LICENSE-MIT](LICENSE-MIT) 或 ) 由您自行选择。 ### 贡献 除非您明确声明,否则根据 Apache-2.0 许可协议的规定,您故意提交以包含在本项目中的任何贡献, 均应按上述方式进行双重许可,无需任何附加的条款或条件。
标签:OpenPGP, Rust, SOC Prime, 加密, 可视化界面, 密码学, 开发工具, 手动系统调用, 漏洞扫描器, 网络流量审计, 通知系统