#secret-key #user-key #key-set #attributes #policy #partition-key #public-key

cosmian_cover_crypt

基于子集覆盖的关键策略属性加密

23个稳定版本 (8个主要版本)

14.0.0 2024年3月7日
13.0.0 2023年11月6日
12.0.3 2023年9月18日
12.0.1 2023年7月20日
6.0.8 2022年10月17日

#141 in 密码学

Download history 345/week @ 2024-04-22 890/week @ 2024-04-29 374/week @ 2024-05-06 312/week @ 2024-05-13 322/week @ 2024-05-20 428/week @ 2024-05-27 409/week @ 2024-06-03 430/week @ 2024-06-10 856/week @ 2024-06-17 711/week @ 2024-06-24 1296/week @ 2024-07-01 948/week @ 2024-07-08 658/week @ 2024-07-15 1374/week @ 2024-07-22 374/week @ 2024-07-29 459/week @ 2024-08-05

3,007 每月下载次数
2 个crate中使用 (通过 cloudproof_cover_crypt)

自定义许可

610KB
4K SLoC

Covercrypt

Build status latest version

CoverCrypt算法的实现,该算法允许为一系列属性创建密文,并针对这些属性发放带有访问策略的用户密钥。

入门指南

请参考examples/runme.rs以获取介绍主要CoverCrypt功能的代码示例。可以通过以下命令运行:cargo run --example runme

构建和测试

仅构建核心,请运行

cargo build --release

构建所有内容

cargo build --release --all-features

代码中包含了许多测试,您可以使用以下方式运行

cargo test --release --all-features

可以通过以下方式运行基准测试(可以传递任何功能标志)

bash ./benches/generate.sh

特性

在CoverCrypt中,消息使用对称方案加密。通过用于封装一系列属性的对称密钥的新型非对称方案来执行正确的管理。这种封装存储在称为加密标题的对象中,其中还包括对称密文。

此设计带来了几个优点

  • 中心机构有一个唯一的密钥来保护(主密钥);
  • 封装可以在不存储任何敏感信息的情况下执行(公开加密);
  • 加密速度与对称方案一样快。

CoverCrypt加密是后量子安全的(具有128位后量子安全性级别)

  • 所有封装都可以使用INDCPA-KYBER进行混合,这是NIST后量子KEM标准Kyber的INDCPA(一个安全级别)版本;安全性的正式证明可以在CoverCrypt论文中找到。
  • 实际数据使用256位密钥的AES-GCM进行加密。

CoverCrypt方案还确保:

  • 用户密钥唯一;
  • 用户密钥可追溯(在某些假设下,参见CoverCrypt论文)。

密钥生成

非对称密钥必须事先生成。这是中心权威机构的角色,负责:

  • 根据正确策略生成和更新主密钥;
  • 根据其权利生成和更新用户密钥。

CoverCrypt API公开了4个函数

  • CoverCrypt::generate_master_keys:生成主密钥
  • CoverCrypt::update_master_keys:更新主密钥
  • CoverCrypt::generate_user_secret_key:创建用户密钥
  • CoverCrypt::refresh_user_secret_key:更新用户密钥

如果策略包含许多权利或用户数量较多,密钥生成可能会很长。但这通常在设置时只运行一次。如果更改很小,密钥更新和刷新将保持快速。

策略和分区

CoverCrypt是一种基于属性的加密算法。这意味着为属性FranceTop Secret生成的加密头部只能由持有对应属性密钥的用户解密。

为了将这种高级视图转换为封装,定义了以下对象

  • 策略:定义所有可能的权利;策略是由属性集组成的轴集合构建的。
  • 加密策略:用于加密的策略的子集;加密策略以属性的真值表达式表示。
  • 用户策略:用户密钥可以解密的权利的子集;用户策略以属性的真值表达式表示。
  • 分区:每个策略轴的一个属性的组合。

在生成主密钥时,全局策略被转换为所有可能的分区集合,并为每个分区生成一个密钥对。主公钥持有所有这些密钥对的所有公钥,而主私钥持有所有这些密钥对的私钥。

在为给定的加密策略加密时,该策略被转换为分区集合。然后,使用主公钥中的相应公子密钥为每个分区生成一个密钥封装。

类似地,在为给定的用户策略生成用户私钥时,该策略被转换为相应的分区集合,用户收到与每个分区相关联的私子密钥。

示例:以下策略由两个轴组成。由三个属性组成的Security轴和由四个属性组成的Country轴。

Policy: {
 Security: { // <- first axis
  None,
  Medium,
  High
 },
 Country: { // <- second axis
  France,
  Germany,
  UK,
  Spain
 }
}

加密策略 Security::Medium && ( Country::France || Country::Spain) 将被转换成两个分区。加密策略 Security::High 将扩展为 Security::High && (Country::France || ... || Country::Spain) 然后转换为 4 个分区。

序列化

序列化密钥和封装的大小由以下公式给出

  • 主密钥:$$3 \cdot L_{sk} + \texttt{LEB128sizeof}(|\mathcal{P}|) + \sum\limits_{p~\in~\mathcal{P}} \left( \texttt{LEB128sizeof}(\texttt{sizeof}(p)) + \texttt{sizeof}(p) + 1 + L_{sk} + \delta_{p,~h} \cdot L_{sk}^{pq}\right)$$
  • 公钥:$$2 \cdot L_{pk} + \texttt{LEB128sizeof}(|\mathcal{P}|) + \sum\limits_{p~\in~\mathcal{P}} \left( \texttt{LEB128sizeof}(\texttt{sizeof}(p)) + \texttt{sizeof}(p) + 1 + L_{pk} + \delta_{p,~h} \cdot L_{pk}^{pq}\right)$$
  • 用户密钥:$$2 \cdot L_{sk} + \texttt{LEB128sizeof}(n_{p}) + \sum\limits_{p~\in~partitions} \left( 1 + L_{sk} + \delta_{p,~h} \cdot L_{sk}^{pq}\right)$$
  • 封装:$$2 \cdot L_{pk} + T + \texttt{LEB128sizeof}(n_{p}) + \sum\limits_{p~\in~partitions} \left(1 + \delta_{p,~c} \cdot L_{pk} + \delta_{p,~h} \cdot L_c^{pq}\right)$$
  • 加密头(封装和对称加密元数据):$$\texttt{sizeof}(encapsulation) + \texttt{LEB128sizeof} \left(C_{overhead} + \texttt{sizeof}(metadata)\right) + C_{overhead} + \texttt{sizeof}(metadata)$$

其中

  • $|\mathcal{P}|$ 是与加密策略相关的分区数量
  • $\delta_{p,~c} = 1$ 如果 $p$ 是经典分区,否则为 0
  • $\delta_{p,~h} = 1 - \delta_{p,~c}$ (即如果 $p$ 是混合分区,则为 1,否则为 0)
  • $\texttt{sizeof}: n \rightarrow$ 以字节为单位 $n$ 的大小
  • $\texttt{LEB128sizeof}: n \rightarrow \left\lceil \frac{8 \cdot \texttt{sizeof}(n)}{7}\right\rceil$

注意:对于我们的实现 CoverCryptX25519Aes256

  • Curve25519 公钥长度:$L_{pk} = 32~\textnormal{bytes}$(压缩 Ristretto 表示法)
  • Curve25519 秘密钥长度:$L_{sk} = 32~\textnormal{bytes}$
  • INDCPA-Kyber 公钥长度:$L_{pk}^{pq} = 1184$
  • INDCPA-Kyber 秘密钥长度:$L_{sk}^{pq} = 1152$
  • INDCPA-Kyber 密文长度:$L_c^{pq} = 1088$
  • EAKEM 标签长度:$T = 16~\textnormal{bytes}$
  • 对称加密开销:$C_{overhead} = 28~\textnormal{bytes}$(MAC 标签 16 字节和nonce 12 字节)

对称密钥封装

这是 CoverCrypt 方案的核心。它允许为给定的一组权利创建对称密钥及其封装。

为了简化封装的管理,API 中提供了一个名为 EncryptedHeader 的对象。加密头包含一个封装以及可选额外数据的对称密文。这些额外数据可以用于存储元数据。

经典实现的大小

分区数量 封装大小(以字节为单位) 用户解密密钥大小(以字节为单位)
1 130 98
2 163 131
3 196 164
4 229 197
5 262 230

后量子实现的大小

分区数量 封装大小(以字节为单位) 用户解密密钥大小(以字节为单位)
1 1186 1250
2 2275 2435
3 3364 3620
4 4453 4805
5 5542 5990

注意:封装的大小随着目标权利集合的大小而增长,封装时间也随之增长。

密钥解封装

用户可以通过解密相关的 EncryptedHeader 来检索用于解密 CoverCrypt 密文的对称密钥。这仅在使用者密钥中包含适当的权利时才可能。

基准测试

本节中展示的基准测试是在 Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz 上运行的。

文档

这篇论文中给出了CoverCrypt方案的正式描述和证明。它还包含了一个关于实现的有趣讨论。

开发者文档可以在doc.rs上找到

依赖关系

~5–7.5MB
~144K SLoC