20个版本 (11个重大更新)

0.13.1 2021年11月29日
0.12.0 2021年1月8日
0.11.1 2020年5月11日
0.11.0 2020年3月11日
0.4.0 2018年11月30日

#319 in 密码学

Download history 62/week @ 2024-04-20 90/week @ 2024-04-27 52/week @ 2024-05-04 24/week @ 2024-05-11 65/week @ 2024-05-18 51/week @ 2024-05-25 129/week @ 2024-06-01 65/week @ 2024-06-08 253/week @ 2024-06-15 34/week @ 2024-06-22 56/week @ 2024-06-29 21/week @ 2024-07-06 38/week @ 2024-07-13 29/week @ 2024-07-20 77/week @ 2024-07-27 30/week @ 2024-08-03

每月176次下载
2 个crate中使用(通过 ironoxide

AGPL-3.0-only

415KB
8K SLoC

recrypt

CI

一个纯Rust库,实现了一组密码学原语,用于构建名为变换加密的多跳代理重加密方案。

什么是变换加密?

假设你有两个(公开、私有)密钥对: (A, AA)(B, BB)

变换加密允许将加密到某个公开密钥(A)的数据进行 变换,使其可以使用另一个用户的私有密钥(BB)进行解密。这个过程需要一个特殊的 变换密钥(A -> B),该密钥通过使用第一个用户的私有密钥(AA)和第二个用户的公开密钥(B)计算得出。 拥有变换密钥并进行变换的人无法解密数据或恢复任何用户的私有密钥。

有关使用recrypt计算变换密钥和应用变换的更多详细信息,请参阅单跳变换加密示例

用法

如果你正在构建应用程序并希望使用变换加密,你可以尝试查看IronCore SDKs,因为它们提供了IronCore隐私平台的部分高级抽象。

  • ironweb - IronCore隐私平台的JavaScript实现。适用于所有现代浏览器。
  • ironoxide - IronCore隐私平台的纯Rust实现。
  • ironoxide-java - 为ironoxide提供的Java绑定。适用于所有JVM语言。
  • ironoxide-scala - 对ironoxide-java的Scala封装。
  • ironode - IronCore隐私平台的NodeJS实现。

所有SDK都旨在相互兼容。

Rust依赖关系

请参阅https://crates.io/crates/recrypt以获取最新版本。

其他绑定

除了原生的Rust实现之外,我们还提供了Recrypt的其他绑定

recrypt 的 Scala 实现也是可用的。查看实现

API 文档和示例用法

请访问 https://recrypt.rs

安全和审计

NCC Group 的 密码学服务团队 对此库进行了审计 - 版本 0.6.2 包含了所有经过审计的代码,包括为解决审计期间发现的问题而创建的更新。NCC Group 的审计发现所选配对和椭圆曲线在密码学上是安全的,并且 Rust 实现是目标协议的忠实和正确体现。此外,审计确认该实现不会通过计时或内存访问模式旁路攻击泄露机密信息。

要了解更多关于我们密码学方法的信息,并阅读我们的出版物,请点击这里

内存保护

我们支持通过 mlock 进行内存保护。这将自动检测并在支持的平台上启用。如果您需要禁用此功能,可以使用默认禁用的 disable_memlock 功能标志。

基准测试

2019-12-04 的 79b6e6 的结果

注意:描述性能最准确的方法是在您的目标环境中运行基准测试

这些基准测试是在 Thinkpad X1 Extreme (Gen2) 上进行的

来自 /proc/cpuinfo 的简略条目

vendor_id       : GenuineIntel
cpu family      : 6
model           : 158
model name      : Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz

如果您不熟悉 criterion.rs 基准测试的输出,请参阅 文档 了解如何解释输出。

$ cargo bench

256-bit generate key pair
                        time:   [757.61 us 760.48 us 764.48 us]
256-bit generate plaintext
                        time:   [2.9911 ms 2.9962 ms 3.0032 ms]
256-bit generate ed25519 keypair
                        time:   [15.627 us 15.686 us 15.793 us]
Found 1 outliers among 20 measurements (5.00%)
  1 (5.00%) high severe
256-bit generate transform key
                        time:   [15.050 ms 15.072 ms 15.094 ms]
256-bit compute public key
                        time:   [715.24 us 717.64 us 720.06 us]
Found 2 outliers among 20 measurements (10.00%)
  2 (10.00%) high mild
256-bit derive symmetric key
                        time:   [1.9093 us 1.9625 us 2.0225 us]
Found 3 outliers among 20 measurements (15.00%)
  2 (10.00%) high mild
  1 (5.00%) high severe
256-bit encrypt (level 0)
                        time:   [7.0845 ms 7.1014 ms 7.1337 ms]
Found 4 outliers among 20 measurements (20.00%)
  1 (5.00%) low mild
  3 (15.00%) high severe
256-bit decrypt (level 0)
                        time:   [6.4466 ms 6.4530 ms 6.4598 ms]
Found 1 outliers among 20 measurements (5.00%)
  1 (5.00%) high mild
256-bit transform (level 1)
                        time:   [18.466 ms 18.492 ms 18.519 ms]
256-bit decrypt (level 1)
                        time:   [22.856 ms 22.888 ms 22.927 ms]
Found 1 outliers among 20 measurements (5.00%)
  1 (5.00%) high severe
256-bit transform (level 2)
                        time:   [41.160 ms 41.339 ms 41.541 ms]
256-bit decrypt (level 2)
                        time:   [38.508 ms 38.560 ms 38.617 ms]
Found 2 outliers among 20 measurements (10.00%)
  1 (5.00%) low mild
  1 (5.00%) high severe

贡献

构建

需要 Rust (稳定版)。

$ cargo build

运行测试

$ cargo test

运行基准测试

$ cargo bench

与代理重加密的关系

在学术文献中,变换加密 被称为 代理重加密。代理重加密 (PRE) 方案是一种公钥加密方案,其中每个参与者都有一对相关的密钥,一个公钥和一个私钥,它们在数学上是相关的。Alice 使用 Bob 的公钥加密一条消息给 Bob,然后 Bob 使用他的公钥解密加密的消息以获取原始消息。

PRE 允许某人(委托者)将解密其消息的能力委托给另一个人(受委托者)。与仅仅将她的私钥与受委托者分享相比,委托者计算一个 变换密钥(或重新加密密钥),允许加密到她的公钥的消息被转换,从而可以使用受委托者的私钥解密。计算此变换密钥需要委托者的私钥和受委托者的公钥;一旦计算出来,该密钥就会存储在 半可信代理 上。

当代理收到加密到委托者的消息时,它使用变换密钥应用变换算法,并将变换后的消息交付给受委托者。代理不需要被信任,因为拥有变换密钥不允许代理解密消息或恢复关于委托者或受委托者私钥的任何信息,即使它与受委托者合作。

当委托者不再希望允许访问时,她只需要求代理丢弃变换密钥。她必须信任代理执行此操作。

PRE 方案属性

对PRE方案进行分类的方式有很多,其中一些最重要的分类方法如下:

  • 方向性 描述了从A到B的委托是否也允许从B到A的转换。单向方案不允许这种转换。
  • 交互性 描述了是否需要双方都积极参与才能生成转换密钥。非交互式方案只需要委托人的公钥。
  • 传递性 描述了代理是否可以重新委托加密。也就是说,如果代理持有从A到B的转换密钥和从B到C的转换密钥,能否生成从A到C的转换密钥?非传递性方案不允许这一点。
  • 共谋安全性 描述了委托人是否可以与持有对其转换密钥的代理共谋以恢复委托人的私钥。共谋安全方案不允许这一点。
  • 多跳 描述了是否允许委托人同时成为委托者。也就是说,方案是否允许已经从Alice转换到Bob的密文随后再从Bob转换到Carol。在多跳情况下,代理将链式进行转换,因此链中的任何委托人都可以解密其委托者可以解密的消息。

Recrypt库实现了单向、非交互、非传递、共谋安全和多跳的PRE方案。

算法

这里实现的PRE算法最初由H. Wang和Z. Cao在2009年ACM计算机与通信安全(CCS)会议的论文《一种完全安全的单向和多用户代理重加密方案》中提出。该算法在2014年IEEE第12届可靠、自主和安全的计算国际会议论文《一种多用户CCA安全的代理重加密方案》中得到了增强。

我们在B. Wall和P. Walsh在2018年SCC会议论文《大规模的密码学强制正交访问控制》中提供了算法的概述,以及如何使用它们来实现访问控制系统的描述。

这些论文中的算法非常通用,没有做出实现选择。它们仅指定了使用双线性配对函数。我们做出了许多实现选择。首先,我们使用最优的Ate配对作为我们的配对函数。这需要一个“配对友好”的椭圆曲线;我们选择了Barreto-Naehrig曲线,该曲线支持配对的高效实现。

我们的实现受到了以下论文的指导:

  • P.S.L.M. Barreto和M. Naehrig发表的《素数阶配对友好椭圆曲线》,发表于《第12届国际选择区域密码学(SAC)研讨会论文集》,2006年,第319-331页。

  • N. Benger和M. Scott发表的《为基于配对的密码学实现构造有限域塔扩展》,发表于《第3届国际有限域算术研讨会论文集》,2010年,第180-195页。

  • J. Beuchat等人发表的《在Barreto-Naehrig曲线上的最优Ate配对的高速软件实现》,发表于《第4届基于配对的密码学国际会议论文集》,2010年,第21-39页。

  • A. J. Devegili等人发表的《在Barreto-Naehrig曲线上的密码学配对实现》,发表于《第1届基于配对的密码学国际会议论文集》,2007年,第197-207页。

  • A. J. Devegili等人发表的《配对友好域上的乘法和平方运算》,2006年发表,可在http://eprint.iacr.org/2006/471获取。

  • R. Granger和M. Scott发表的《六次扩展的循环子群上的快速平方运算》,发表于《第13届公共密钥密码学实践与理论国际会议论文集》,2010年,第209-223页。

  • A. Karatsuba和Y. Ofman发表的《在自动机上对多位数进行乘法运算》,发表于《苏联物理学快报》,第7卷,1963年1月。

  • “加密配对的新软件速度记录”由M. Naehrig,R. Niederhagen和P. Schwabe所著,收录于《拉丁美洲密码学和信息安全进展国际会议(LATINCRYPT)论文集》,2010年,第109-123页。

  • “在普通椭圆曲线计算配对中的最终指数运算”由M. Scott等人发表,收录于《基于配对的密码学国际会议(PKC)论文集》,2009年,第78-88页。

此外,还有书籍:《基于配对的密码学指南》由N.E. Mrabet和M. Joye著,Chapman and Hall/CRC密码学与网络安全系列,2016年。

许可证

Recrypt-rust遵循GNU Affero通用公共许可证。我们还提供商业许可证 - 邮箱获取更多信息。

版权(c)2018-至今 IronCore Labs,公司。保留所有权利。

依赖项

约4.5-6MB
约114K SLoC