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, 加密, 可视化界面, 密码学, 开发工具, 手动系统调用, 漏洞扫描器, 网络流量审计, 通知系统