OpenPGP implemented in pure Rust, permissively licensed
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 7 天前 | ||
| 6 个月前 | ||
| 2 个月前 | ||
| 6 个月前 | ||
| 7 天前 | ||
| 1 年前 | ||
| 7 天前 | ||
| 7 天前 | ||
| 2 年前 | ||
| 1 年前 | ||
| 1 年前 | ||
| 3 个月前 | ||
| 2 年前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 8 年前 | ||
| 8 年前 | ||
| 1 年前 | ||
| 7 天前 | ||
| 2 年前 | ||
| 2 年前 | ||
| 7 个月前 | ||
| 1 年前 |
rPGP
采用纯 Rust 实现的 OpenPGP,以宽松许可证授权
rPGP 是依据 RFC9580 规范以纯 Rust 实现的 OpenPGP。 它支持常用的 v4 格式,以及最新的 v6 密钥格式和 AEAD 加密机制。 (历史 RFC RFC4880 和 RFC6637 中规定的全部格式,包括 v3 密钥和签名,也都受到支持。)
如需了解已实现的 PGP 特性的更多详情,请参阅 IMPL_STATUS;如需了解 OpenPGP 格式与机制的背景说明,请参阅"OpenPGP 格式与机制概览"。
rPGP 提供灵活的底层 API,使用户能够以尽可能兼容的方式构建更高层的 PGP 工具。 此外,它完整支持 Autocrypt 1.1 e-mail encryption specification 要求的全部功能。
知名用户与基于 rPGP 构建的库
- Delta Chat:通过电子邮件运行的跨平台即时通讯应用
- GpgFrontend:可选使用 rPGP 后端的跨平台 OpenPGP 桌面应用
debian-packaging:用于处理 Debian 软件包的库 cratehimalaya:用于管理电子邮件的 CLI(包含pgp-lib组件)oct-git:Git 签名与验证后端(专注于 OpenPGP 卡片)prs-lib:受 pass 启发的 CLI 密码管理器(可选使用 rPGP 后端,并支持 OpenPGP 卡片)rpgpie:实验性 OpenPGP 语义库rpm:纯 Rust 编写的 RPM 文件解析与创建库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")?;
let payload = msg.as_data_string()?;
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: {:?}", payload);
}
Ok(())
}
使用 OpenPGP 密钥对生成并验证分离签名
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: 允许构建为 wasmlarge-rsa: 允许使用非常大的 RSA 密钥(将上限从 8192 位提高到 16384 位)malformed-artifact-compat: 对某些类型格式异常的工件保持宽容(错误构造的 ECDH PKESK;无效且过短的初始分部消息体段;无法往返的嵌入式签名,这些签名会作为不透明子包原样保留,以便包含它们的证书仍可导入——受影响的子密钥绑定将无法验证)。大多数用户都不需要此特性,默认应当禁用!pqc: 启用 RFC 9980 中规定的 PQC 支持实现(该特性此前名为draft-pqc)draft-wussler-openpgp-forwarding: 启用对 draft-wussler-openpgp-forwarding 中所定义格式和功能的支持
当前状态
最后更新于 2025 年 9 月
- 实现状态:
IMPL_STATUS.md - 安全状态:
SECURITY_STATUS.md - 支持的平台:
PLATFORMS.md
常见问题
参见 FAQ.md。
rPGP 是面向应用开发者的库
rPGP 旨在帮助应用开发者轻松地将 OpenPGP 功能集成到他们的项目中。
需要注意的是,OpenPGP 格式及其语义相对复杂。 我们推荐阅读《OpenPGP for application developers》(https://openpgp.dev/) 作为初步入门资料。
另外,我们欢迎在 rPGP issue tracker 中提问。
rPGP 是一个底层 OpenPGP 库
rPGP 提供了用于处理 RFC 9580 中指定格式和机制的抽象。 然而,它只提供相对较低层的构建块,并不保证用户不会不安全地使用它们。
rPGP 可以遵循 OpenPGP 规范的几乎所有部分,但这些 API 只是底层构建块,并不声称使用它们(a)安全,或(b)符合 OpenPGP 规范
正确、安全地使用 rPGP 中的构建块,需要对 OpenPGP 有扎实的理解,并对密码学至少有基本了解。
OpenPGP 是一种分层技术
从上下文来看,OpenPGP 可以视为一种多层技术,大致如下:
- 线格式:数据包封装, 数据包内容, ASCII 装甲, ...
- 按照文法构建的复合对象(例如证书、消息)
- 数据处理功能,例如计算和验证 OpenPGP 签名,以及对消息进行加密与解密。
- OpenPGP 语义(例如:证书及其组件的 Expiration 和 Revocation,用于定义给定组件密钥可用于哪些语义操作的 Key Flags,算法偏好指示,...)
在这些层中,OpenPGP RFC 规定了第 1 至第 3 层,而第 4 层未作详细说明。
有关形式化 OpenPGP 语义的工作,可以在 draft-gallagher-openpgp-signatures 和 draft-dkg-openpgp-revocation 中找到。
与 RFC 类似,rPGP 处理第 1 至第 3 层,但明确不处理第 4 层。 需要使用 OpenPGP 语义的应用必须手动实现这些语义,或依赖额外库来处理该层。
注意:rpgpie 库实现了其中一些高层 OpenPGP 语义。
无论是将其集成到 rPGP 项目中,还是作为参考来研究,都可能有用。
OpenPGP 中的机制会随时间演进
rPGP 可以处理大量 OpenPGP 工件。 它支持 OpenPGP 中几乎全部机制,既包括现代机制,也包括如今已视为遗留的机制。
这明确包括使用历史算法的工件;按照当前认知,这些算法已不安全。
rPGP 并不确保应用开发者为其目的使用合适的密码学构建块 (尽管它默认通常能够生成符合现代要求的工件)。
有关 OpenPGP 随时间演进的更多细节,请参阅 "OpenPGP 格式与机制概览"。
最低支持 Rust 版本(MSRV)
本仓库中的所有 crate 均支持 Rust 1.88 或更高版本。未来最低支持的 Rust 版本可能会发生变化,但会以小版本升级的方式进行调整。
资助
rPGP 的 RFC 9580 支持 部分通过 NGI0 Core 获得资助, 该基金由 NLnet 设立, 并获得欧盟委员会 Next Generation Internet 计划的资金支持。
许可证
本项目采用以下任一许可证授权:
- Apache 许可证,第 2.0 版(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您另有明确说明,否则您有意提交以纳入 本项目的任何贡献(按照 Apache-2.0 许可证的定义), 均将按上述方式采用双重许可,且不附加任何其他条款或条件。