12个版本 (5个重大更新)

0.9.1 2023年4月9日
0.5.1 2023年4月6日
0.5.0 2022年11月6日

#530 in 密码学

MIT/Apache

72KB
1K SLoC

libes

Crates.io GitHub last commit Crates.io docs.rs Libraries.io

加密方案库是一个椭圆曲线集成加密方案变体的集合。

这个库的目标是成为一个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(加密安全随机数生成器)生成。

维基百科
Crypto++
开发者实用密码学

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.mdhttps://github.com/TJRoh01/libes/blob/main/README.md#ecies-mac-flowchart)。

ECIES-AEAD流程图

请参阅GitHub上的README.mdhttps://github.com/TJRoh01/libes/blob/main/README.md#ecies-aead-flowchart)。

ECIES-SYN流程图

请参阅GitHub上的README.mdhttps://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