12个版本 (5个重大更新)
0.9.1 | 2023年4月9日 |
---|---|
0.5.1 | 2023年4月6日 |
0.5.0 | 2022年11月6日 |
#530 in 密码学
72KB
1K SLoC
libes
加密方案库是一个椭圆曲线集成加密方案变体的集合。
这个库的目标是成为一个ECIES的一站式商店。
有关代码文档、使用说明和示例,请参阅Docs.rs。
⚠️ 测试版发布轨道 - 不适合生产使用 ⚠️
在测试版开发期间,版本0.2+.Z向后兼容解密得到保证。
这意味着使用库版本X.Y.Z加密的数据可以使用任何后续库版本解密,只要X相同,即使加密算法被撤销,也仍然可用于解密,直到X增加。
公共API结构将不会更改,但任何因任何原因被发现损坏的算法将立即被移除,库将以X.Y.Z中Y增加的形式发布,并撤销实现该算法的版本。
私有API仍在开发中,因此请确保始终使用最新的版本0.Y.Z以接收所有发布的补丁。X.Y.Z中的Z增加不需要对您的代码进行任何修改,当然,除了解密的算法被撤销的情况。
为什么使用libes?
Rust密码学生态系统充斥着各种crate,质量文档各不相同。我已承担起这项任务,并希望与像我一样试图理解它的人分享我的发现。
在此过程中,我致力于
- 维护一个精选的相关crate集合
- 验证依赖项在实现中未犯错误
- 使用性能良好、代码和文档质量高的依赖项
- 提供统一和可预测的API
- 在API中使用共享构造函数以确保一致性
- 确保所有主要版本的长期支持
- 在文档中力求清晰和详细
- 保持库更新且无漏洞
- 自动更新依赖项并测试代码
- 优先处理实现的问题和反馈
目录
常见问题解答
待定
关于
什么是ECIES?
ECIES代表椭圆曲线集成加密方案。它是一种加密过程,允许在只知道要加密的数据和接收者的公钥的情况下,对特定接收者进行加密,其他所有内容都从输入派生或使用CSPRNG(加密安全伪随机数生成器)生成。
ECIES变体
密码算法随着时间的推移而发展,因此截至写作时已演变成两种不同的ECIES变体。
最初,ECIES依赖于密钥交换操作、加密操作和单独的MAC操作。
MAC(消息认证码)是必要的,以在机密性之上提供真实性。通过利用漏洞和/或受损的参数,加密数据可能被操纵以产生所需的结果,而不是发送者意图的结果。MAC可以单独使用加密数据来验证此类操纵没有发生。
最近采用的加密算法,如AES256-GCM和ChaCha20-Poly1305,是AEAD(带有附加数据的认证加密)算法,除了密文外,还产生一个认证标签,在此情况下与MAC具有相同的作用,但集成在加密算法本身中。
库和文档将称这两个变体为
- ECIES-MAC(带MAC的加密)
- ECIES-AEAD(代替MAC的AEAD加密)
进一步迭代ECIES-AEAD,可以通过合成IV/Nonce而不是随机生成它来进一步集成。这将消除存储和传输IV/Nonce的需要,以及减少约一二十字节的开销。因为已经在临时密钥中有随机数据,因此两次导出相同的IV/Nonce的风险与随机生成相当,因此这样做应该是安全的。这个第三种变体将被称为ECIES-SYN。
免责声明:ECIES-SYN尚未接受安全审计!ECIES-SYN是我自己的想法,我只会将其用于我已经进行了广泛研究的算法,以确保这样做是密码学安全的。无论如何,我不是密码学研究人员,不能保证将来不会出现问题。如果ECIES-SYN证明是有用/受欢迎的,并且资源允许,我将确保它接受安全审计。
ECIES-MAC流程图
请参阅GitHub上的README.md(https://github.com/TJRoh01/libes/blob/main/README.md#ecies-mac-flowchart)。
ECIES-AEAD流程图
请参阅GitHub上的README.md(https://github.com/TJRoh01/libes/blob/main/README.md#ecies-aead-flowchart)。
ECIES-SYN流程图
请参阅GitHub上的README.md(https://github.com/TJRoh01/libes/blob/main/README.md#ecies-syn-flowchart)。
SemVer
此库遵循SemVer,并保证解密向后兼容性。
这意味着使用库版本X.Y.Z加密的数据可以使用任何更高版本的库进行解密,只要X相同。
例如,使用版本0.5.7加密的数据可以使用版本0.5.7或0.11.1进行解密,但不能使用版本1.2.3、0.5.6或0.4.10。
将努力保持X(主版本)的解密向后兼容性,但无法保证。
发布轨道
- v0.1.Z:alpha - 初始结构
- v0.(2+).Z:beta - 添加算法、内存归零和其他功能
- v1.0.0-pre.W:预生产 - 重构
- v1.0.0:初始生产 - 可能向后不兼容的重构
- V1.(1+).Z:生产 - wasm支持等
条件编译
所有算法组合都由功能控制,以减少编译量。功能名称与支持矩阵中的算法名称完全一致(如果有替代名称如P-521和secp521r1,则它们是别名,因此可以选择启用任何一个)。此库使用特性来实现对有效用户定义变体的适当功能。
注意:在不激活任何功能的情况下,不可用ECIES变体,至少必须激活每个功能类别中的一个。
- 椭圆曲线(例如x25519)
- 加密(例如AES256-GCM)
- 身份验证(例如ECIES-AEAD或HMAC-SHA256)
注意:为了使ECIES组合有效,椭圆曲线、加密和身份验证算法必须都支持相同的ECIES变体。
- 要使用ECIES-MAC,所有三个选定的算法在其各自的ECIES-MAC列中都需要一个"🚀"。
- 要使用ECIES-AEAD或ECIES-SYN,前两个算法的ECIES-变体列中都需要一个"🚀"。
算法支持
矩阵条目形式为加密 & 解密
或加密
/解密
支持图标说明
- 🚀 完成
- 🏗️ 开发
- 📅 计划中
- 🤔 规划中
- 🚫 无法/不会实现
椭圆曲线支持矩阵
算法/ECIES 变体 | ECIES-MAC | ECIES-AEAD | ECIES-SYN |
---|---|---|---|
x25519 | 🚀 | 🚀 | 🚀 |
ed25519 | 🚀 | 🚀 | 🚀 |
K-256 / secp256k1 | 🚀 | 🚀 | 🚀 |
P-256 / secp256r1 | 🚀 | 🚀 | 🚀 |
P-384 / secp384r1 | 🚀 | 🚀 | 🚀 |
P-521 / secp521r1 | 🤔 | 🤔 | 🤔 |
加密支持矩阵
算法/ECIES 变体 | ECIES-MAC | ECIES-AEAD | ECIES-SYN |
---|---|---|---|
ChaCha20-Poly1305 | 🚀 | 🚀 | 🚀 |
XChaCha20-Poly1305 | 🚀 | 🚀 | 🚀 |
AES128-GCM | 🚫[^1] | 🚫[^1] | 🚫[^1] |
AES256-GCM | 🚀 | 🚀 | 🚀 |
身份验证支持矩阵
算法/ECIES 变体 | ECIES-MAC |
---|---|
HMAC-SHA256 | 🚀 |
HMAC-SHA512 | 🤔 |
[^1]: AES128-GCM使用128位密钥和96位nonce,当使用CSPRNG作为生成它们的默认来源时,在224位空间中的碰撞风险是不令人满意的。由于这一点,加密没有实现,以及解密,以避免鼓励在其它库中使用此变体。注意:与AES128-GCM一样,此库中的AES256-GCM和某些其他加密算法也使用96位nonce,但与AES256-GCM不同,它们具有更大的密钥,例如256位,当与96位nonce结合时,碰撞风险是可以接受的。
许可
在以下任一许可下授权
任选其一。
贡献
所有贡献都备受赞赏。
- 如果您在此crate或其任何依赖项中发现错误或漏洞,请使用修复算法模板打开一个问题。
- 如果您想建议添加对新的算法的支持,请使用添加算法模板。
- 如果您认为某个算法的支持应该被弃用,请使用弃用算法模板。
对于所有其他问题,请尽量提供足够的信息,以便在不提出过多后续问题的情况下确定要做什么或如何规划。
除非您明确声明,否则您根据Apache-2.0许可定义的任何旨在包含在此项目中的故意提交的贡献,将按上述方式双许可,而无需任何额外的条款或条件。
依赖项
~0.7–3MB
~53K SLoC