参考文献:
- [Has88] Hastad J. Solving simultaneous modular equations of low degree[J]. siam Journal on Computing, 1988, 17(2): 336-341.
- [BBM00] Bellare M, Boldyreva A, Micali S. Public-key encryption in a multi-user setting: Security proofs and improvements[C]//Advances in Cryptology—EUROCRYPT 2000: International Conference on the Theory and Application of Cryptographic Techniques Bruges, Belgium, May 14–18, 2000 Proceedings 19. Springer Berlin Heidelberg, 2000: 259-274.
- [CS03] Cramer R, Shoup V. Design and analysis of practical public-key encryption schemes secure against adaptive chosen ciphertext attack[J]. SIAM Journal on Computing, 2003, 33(1): 167-226.
- [HHK17] Hofheinz D, Hövelmanns K, Kiltz E. A modular analysis of the Fujisaki-Okamoto transformation[C]//Theory of Cryptography Conference. Cham: Springer International Publishing, 2017: 341-371.
- [GHP18] Giacon F, Heuer F, Poettering B. KEM combiners[C]//Public-Key Cryptography–PKC 2018: 21st IACR International Conference on Practice and Theory of Public-Key Cryptography, Rio de Janeiro, Brazil, March 25-29, 2018, Proceedings, Part I 21. Springer International Publishing, 2018: 190-218.
- [BDG20] Bellare M, Davis H, Günther F. Separate your domains: NIST PQC KEMs, oracle cloning and read-only indifferentiability[C]//Advances in Cryptology–EUROCRYPT 2020: 39th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Zagreb, Croatia, May 10–14, 2020, Proceedings, Part II 30. Springer International Publishing, 2020: 3-32.
- [DHK+21] Duman J, Hövelmanns K, Kiltz E, et al. Faster lattice-based KEMs via a generic Fujisaki-Okamoto transform using prefix hashing[C]//Proceedings of the 2021 ACM SIGSAC Conference on Computer and Communications Security. 2021: 2722-2737.
- [PR23] Poettering B, Rastikian S. A study of KEM generalizations[C]//International Conference on Research in Security Standardisation. Cham: Springer Nature Switzerland, 2023: 53-77.
- 后量子 KEM 方案:Kyber
- FO-like Transformation in QROM
文章目录
- Multi-user Setting
- FO with Prefix Hashing
- KEM Generalizations
- VKEM
- KDFEM
- Key Transport
- KEM Combiner
Multi-user Setting
通常的,PKE 的安全性定义都是针对 Single-user Setting 来说的:单个用户生成公私钥对,敌手试图区分密文、恢复明文、恢复私钥。然而 [Has88] 给出了 RSA 的一种攻击:三个用户分别生成公私钥对,另一个用户发送相同的消息给他们(不同密文的消息存在关联),敌手利用这些密文所加密的是同一个明文的关系,可以恢复出这个消息。这种场景称为 Multi-user Setting,敌手的攻击能力更强。一种解决办法是在明文后边 padding 一个随机串,从而相同消息被强行设置为了部分随机的消息,这使得 RSA 从确定性加密(仅仅是 OW 的)转化为了随机加密(具备 IND 的性质)。
Single-user Setting 下的 IND 安全性,就是常规的那种 IND-CPA/CCA,
[BBM00] 给出了 Multi-user Setting 下的 IND 安全性的定义,
[BBM00] 证明了 IND-CPA/CCA in the Single-user Setting 直接导致了 IND-CPA/CCA in the Multi-user Setting,损失因子正比于用户数量。
FO with Prefix Hashing
Multi-user Setting 的敌手能力比 Single-user Setting 的能力更强,虽然 [BBM00] 证明了在 Single-user 安全蕴含了 Multi-user 安全。但是为了增加信心,一种通用的设计范式是:域分离(domain separate),使得不同的 User 使用不同的随机函数。例如把公钥也作为 RO 的输入,额外的好处是让最终获得的 shared key 同时依赖双方的随机性。
然而,可以证明域分离确实可以增加数字签名的安全性,但是对于 PKE 人们并没有给出形式化证明。[DHK+21] 证明在 FO 转换中把公钥作为 KDF 的一部分,可以使得在 Multi-user Setting 下从 IND-CCA 到 IND-CPA 的归约更紧。
确切地说,对于 [HHK17] 中的 F O m ⊥̸ FO_m^{\not \perp} FOm⊥ 转换,将原始的
r ← G ( m ) , K ← H ( m ) r \gets G(m), K \gets H(m) r←G(m),K←H(m)
改变为(使用了 [BDG20] 的 output-splitting functor)
( K , r ) ← F ( p k , m ) (K,r) \gets F(pk,m) (K,r)←F(pk,m)
另外 [DHK+21] 发现将 pk 完全输入到 RO 中是不必要的。事实上,格密码的基本运算很快,同时公钥的规模却很大,这导致 Hash 的运算占据主导开销。我们只需要将 pk 不可预测的一小部分输入到 Hash 函数中即可。令 I D : p k → { 0 , 1 } 256 ID:pk \to \{0,1\}^{256} ID:pk→{0,1}256 是某个简单的变换函数,现在的 KDF 变为了
( K , r ) ← F ( I D ( p k ) , m ) (K,r) \gets F(ID(pk),m) (K,r)←F(ID(pk),m)
将这个 FO 变换记为 F O I D ( p k ) , m ⊥̸ FO_{ID(pk),m}^{\not\perp} FOID(pk),m⊥,它采用了 implicit rejection
以及 prefix hashing(将 pk 作为前缀)
对于 Kyber 方案的具体实现,
- 公钥是 ( ρ , t ) (\rho,t) (ρ,t),其中 ρ \rho ρ 是生成 A A A 的种子, t t t 是第二分量 b = A s + e b=As+e b=As+e 的 NTT 表示,打包为紧凑的比特串。根据简单的傅里叶分析,噪声 e e e 的频域的前若干个系数基本是均匀分布的,因此可以使用 t t t 的前缀 32 32 32 字节作为 I D ( p k ) ID(pk) ID(pk)。我们不使用种子 ρ \rho ρ,因为有些场景中它可能被复用。
- 封装:随机采样 m m m,计算 ( K , r ) ← F ( I D ( p k ) , m ) (K,r) \gets F(ID(pk),m) (K,r)←F(ID(pk),m),加密 c ← E n c ( p k , m ; r ) c \gets Enc(pk,m;r) c←Enc(pk,m;r),输出 ( K , c ) (K,c) (K,c)
- 解封装:解密 m ′ ← D e c ( s k , c ) m' \gets Dec(sk,c) m′←Dec(sk,c),计算 ( K , r ) ← F ( I D ( p k ) , m ′ ) (K,r) \gets F(ID(pk),m') (K,r)←F(ID(pk),m′),检查 E n c ( p k , m ′ ; r ) Enc(pk,m';r) Enc(pk,m′;r) 是否等于 c c c,输出 K K K 或者随机伪密钥 K ′ ← F 1 ( I D ( p k ) , s , c ) K'\gets F_1(ID(pk),s,c) K′←F1(ID(pk),s,c),这里 F 1 F_1 F1 就是 F F F 的前缀 K K K 的部分。
对于不受侧信道攻击的场景,可以仅当 E n c ( p k , m ′ ; r ) ≠ c Enc(pk,m';r) \neq c Enc(pk,m′;r)=c 之后才计算 K ′ K' K′,可以加快计算速度,同时它仅在计时攻击下泄露显式拒绝。事实上 [HHK17],在 ROM 下 FO with explicit rejection 也是安全的。不过他们建议最好还是给出常数时间的实现。
安全归约:
效率测试:
KEM Generalizations
[CS03] 提出 KEM+DEM paradigm,它将 PKE 的构造划分为了两个原语,使得灵活性更好。人们关注如何构造 KEM 方案,然后将它转化为其他的原语。
Key Transport:KEM 可以视为只有单方验证的 KT 协议。为了构造主动攻击下安全的 KT 协议,我们可以用 KEM 协商出会话密钥 k k k,然后使用 IND-CCA DEM 传递秘密信息 c = D E M . E n c ( k , k ′ ; r ) c=DEM.Enc(k,k';r) c=DEM.Enc(k,k′;r)。这里的 DEM 可以使用 AE 或者 AEAD 来实现。
KEM Combiner:人们可能信任不同的 KEM 方案,[GHP18] 提出了 KEM 组合器,只要其中一个 KEM 是安全的,那么它产生的 KEM 就是安全的。简单地异或 k ← k 1 ⊕ k 2 k \gets k_1 \oplus k_2 k←k1⊕k2 对于主动敌手是不安全的,需要使用 PRF,一种是 k ← F ( k 1 , c 2 ) ⊕ F ( k 2 , c 1 ) k \gets F(k_1,c_2) \oplus F(k_2,c_1) k←F(k1,c2)⊕F(k2,c1),另一种是 k ← H ( k 1 , k 2 , c 1 , c 2 ) k \gets H(k_1,k_2,c_1,c_2) k←H(k1,k2,c1,c2)
然而,他们都需要额外的对称原语。[PR23] 指出这是由于 KEM 的抽象带来的限制。他们给出了 KEM 的适度增强,使得 KEM 可以直接构造出 KT 和 Combiner,而不再需要额外的对称原语。类似于之前的一些工作,[PR23] 使用 Label 和 Tag 去增强 KEM 概念,给出了两种新概念。
原始的 KEM 定义:
VKEM
首先是 versatile key encapsulation mechanism 概念,
要求它具有: handle freshness、history matching、key recovery、handle divergence 性质。为了 KEM Combiner 的归约,额外需要 label binding 性质。
[PR23] 给出了一种简单的方式将 KEM 转换为 VKEM:
KDFEM
其次是 key derivation function encapsulation mechanism 概念,
它的 KEM 并非封装 key 本身:而是封装一个 KDF,最后用 KDF 生成 key
[PR23] 证明只需对 NIST KEM(Kyber, McEliece, Saber, NTRU)做很小的修改,就能使他们变成 KDFEM
Key Transport
KT 的定义为:
基于 KDFEM 构造 KT,采取 encrypt-then-mac approach,其中的 One-time Pad 和 MAC 就直接使用所封装的 KDF,如图:
KEM Combiner
基于两个 VKEM 的组合器:第一阶段输出的 h d 1 , h d 2 hd_1,hd_2 hd1,hd2 包含了一些信息,将它们交换到第二阶段中,
基于两个 KDFEM 的组合器:它们分别封装了 f 1 , f 2 f_1,f_2 f1,f2,交叉混合为 k ← f 1 ( h d 2 ) + f 2 ( h d 1 ) k \gets f_1(hd_2)+f_2(hd_1) k←f1(hd2)+f2(hd1),