量子就绪:混合密钥交换机制
延续我们上一篇关于签名混合的文章,本文涵盖了混合密钥交换的基础知识,以确保数据的最大安全性。
与数字签名方案相比,互联网上共享密钥的方式更需要过渡到后量子时代。由于对新的“后量子”密钥交换方案的了解相对不够充分,大多数机构鼓励使用混合方案,将知名经典方案的稳健性与较新方案提供的后量子保护相结合。这篇博客文章详细介绍了混合密钥交换的主要概念现状。
快速回顾:定义
密钥封装机制
将某物称为密钥封装机制(KEM)只是一种对您已知问题的通用解决方案的华丽称呼:Alice和Bob如何通过公共渠道共享一个秘密?在经典密码学中,这个问题通过Diffie-Hellman密钥交换来解决:Alice和Bob发布各自的公钥,并将他们的私钥与对方的公钥混合,以得到只有他们知道的相同秘密值。在后量子密码学中,存在各种技术来建立这个共享秘密,其中一些技术在我们之前关于基于格的方案的文章中已经讨论过。
一个密钥封装机制由三个例程定义:
KeyGen():负责生成一个由私钥部分和公钥部分组成的密钥对。Encaps(K_pub):负责生成一个秘密值和一个“封装”,封装是一个数据块,只有拥有相应私钥的人才能将其转换回秘密值。Decaps(K_priv, caps):用于通过相应的私钥从封装中恢复秘密值。
例如,经典的Diffie-Hellman(DH)密钥交换可以通过如下定义三个例程来看作一个KEM:
- DH公共参数:一个生成元 g
KeyGen():选择一个随机整数 s。返回K_priv = s和K_pub = g ** sEncaps(K_pub):封装可以看作一个短暂的Diffie-Hellman密钥交换。首先选择一个随机整数 x,然后计算相关的公钥,该公钥将作为您的封装caps = g ** x,以及共享秘密secret = K_pub ** xDecaps(caps, K_priv):解封只是计算短暂公钥和我们自己私钥之间的密钥交换。secret = caps ** K_priv
混合化
混合化是将后量子和经典方案结合起来的做法,以获得一种新的、对经典和量子攻击都更具弹性的方案。更多细节和更完整的定义已经在我们之前关于混合签名的博客文章中介绍过。我们鼓励您阅读它,如果您还没有这样做的话。
组合KEMs
F. Giacon、F. Heuer和B. Poettering在2018年的一篇研究论文中深入研究了KEM组合器。在这篇论文中,他们介绍了一种组合器的一般构造,其中所有的密钥交换都是并行执行的。实际的组合工作是在最后进行的,作为一个所有共享秘密、封装和公钥的函数W,它输出组合后的共享秘密。
在以下部分中,我们研究这样的函数,并深入了解为什么它们可能是或不是合适的选择。
串联共享秘密
在将许多秘密组合成一个时,人们可能采取的第一种方法是简单地将它们全部串联起来。
|
|
然而,有一些原因说明这可能不是最好的做法:
- 最终共享秘密的长度随着组合的KEM数量及其输出大小而变化。
- 如果其中一个KEM被破解,最终共享秘密将部分为攻击者所知。因此,它将不再完全“秘密”。
理想情况下,破解我们组合器中除了一个KEM之外的所有KEM,都不应提供足够的信息来猜测最终共享秘密的部分。直观地说,我们希望我们的KEM能将每个KEM带来的熵扩散到最终共享秘密的所有比特中。
串联共享秘密,然后哈希
根据之前学到的关于熵扩散的经验,人们可以想到以下组合器作为下一个迭代:
这个组合器将组件KEM的共享秘密串联起来,然后对它们执行密钥派生操作(例如使用哈希函数),以形成最终的共享秘密。这确保了每个输出比特在熵方面都依赖于每个输入比特。然而,在一个我们的理想组合器必须“至少和每个成分KEM一样好”的世界里,这仍然是不够的。
为了进一步证明这一点,让我们研究一下“会话密钥不可区分性”的概念(在两篇IACR论文中讨论过)。它描述了对手在给定相应封装的情况下,区分共享秘密和随机数据块的能力。
我们可以把会话密钥不可区分性想象成给定两个可能的答案来猜测“盒子里是什么?” 我们将在这里介绍两个级别的会话密钥不可区分性:
- 抗选择明文攻击的不可区分性(IND-CPA):挑战者提供一个公钥、一个封装、其相关的共享秘密和一个随机数据块。对手可以访问一个封装预言机,他们可以随心所欲地调用它,使用他们选择的任何公钥。在某一时刻,对手必须决定提供的两个数据块中哪一个是所提供的封装所包装的共享秘密。
- 抗选择密文攻击的不可区分性(IND-CCA):挑战者仍然提供一个公钥、一个封装、其相关的共享秘密和一个随机数据块。对手现在可以访问一个
Encaps(P)和一个Decaps(caps)预言机(使用与挑战相同的密钥进行解封装),他们可以随心所欲地调用它们,对任何输入调用,除了提供的封装。在某一时刻,对手必须决定提供的两个数据块中哪一个是所提供的封装所包装的共享秘密。
跟随我们“盒子里是什么?”的比喻,您可以将IND-CPA想象成拥有一台礼品包装机,允许您在猜测原始盒子里是什么之前包装任意多的物品。IND-CCA让您可以使用一台包装机和一台拆包装机,您可以用它们来问任何事情,但不能拆开原始盒子。
一个KEM的安全性可以根据这些安全属性来评估,我们希望我们的组合器能达到与最佳成分KEM相同级别的会话密钥不可区分性。
遗憾的是,串联然后哈希的组合器在一般情况下不符合我们的期望。确实,让我们考虑两个KEM,KEM_X和KEM_Y。进一步假设KEM_X是IND-CCA安全的,但KEM_Y被以某种方式破解,以至于有可能为一个固定的(但秘密的)私钥k找到封装/共享秘密碰撞,即对于某个封装caps,找到caps′ ≠ caps使得Decaps(caps,k) = = Decaps(caps′,k)。我们注意到KEM_Y不是IND-CCA安全的;给定一个挑战(caps,sA,sB),对手可以生成一个与caps碰撞的封装caps′,然后查询解封装预言机Decaps(caps′)。然后对手可以使用预言机返回的共享秘密赢得游戏。
确实,当提供一个挑战(caps,sA,sB)(其中caps由KEM_X的X_caps和KEM_Y的Y_caps组成)时,对手能够制作Y_caps′ ≠ Y_caps,其用KEM_Y解封装到相同的共享秘密。因此,对手有两个不同的封装caps = X_caps, Y_caps和caps′ = X_caps, Y_caps′,它们用我们的组合KEM解封装到相同的共享秘密。使用与KEM_Y不是IND-CCA相同的论点,组合KEM在KEM_X是IND-CCA的情况下不是IND-CCA。
请注意,一个像前面演示中那样具有碰撞的KEM_Y可以用Diffie-Hellman密钥交换来实例化,前提是参数选择不当:
|
|
正如您所见,对于给定的封装和选择不当的私钥,可以在这个方案中立即找到碰撞的封装。
尽管如此,根据M. Barbosa等人的研究,如果能够证明组件KEM的密文抗第二原像性,那么“串联然后哈希”的组合是安全的。这一特性在我们的示例中显然没有得到尊重,因为KEM_Y是专门为提供碰撞而设计的,因此导致了结果KEM的IND-CCA失效。
串联共享秘密和封装,然后哈希
对于一般情况,M. Campagna & A. Petcher 2020年的论文提议将每个KEM的封装和公钥也纳入混合。这一添加有助于防御前一段中提出的攻击,因为碰撞封装的最终共享秘密现在将会不同。然而,后量子算法的封装和密钥比经典算法要大得多。因此,这种构造带来了不可忽视的开销,表现为对密钥派生函数调用的输入更大。
为了避免这种性能缺陷,IETF的Composite ML-KEM草案提出了不同的方法。通过证明ML-KEM具有密文抗第二原像性,他们可以安全地将大的ML-KEM封装和公钥从KDF输入中省略。这种方法在不损失性能的情况下保持了所需的IND-CCA安全性。
|
|
IETF Composite ML-KEM中使用的组合器函数。Domain是一个常量,用于指示具体组合了哪一对算法。
经验总结
混合密钥交换提供了一条审慎的前进道路,融合了经过时间考验的经典算法安全性和面向未来的后量子方案。然而,本文证明了用于组合这些方案的方法与方案本身同样关键。我们已经看到,简单地串联共享秘密是不够的,甚至更直观的“串联然后哈希”方法也可能引入细微的漏洞。
要构建一个真正具有弹性的混合KEM,有两条主要路径:
- 通用构造:不仅将每个KEM的共享秘密,还将它们的封装和公钥都纳入最终的密钥派生函数中。这是更安全的路径,但由于后量子生成物的大小,可能会带来显著的性能成本。
- 更优化的方法,例如IETF为Composite ML-KEM所采取的方法,依赖于证明组件KEM更强的安全属性,例如密文抗第二原像性。这允许进行更精简的组合,从哈希中省略庞大的后量子封装和密钥,在不牺牲安全性的情况下实现高性能。
总之,设计安全的混合机制是一项细致的任务,无论是对于签名还是密钥交换。开发人员应依赖标准化且经过严格分析的结构,例如IETF提出的那些,而不是仅仅依赖直觉来发明自定义的解决方案。这些标准为实现高安全性和实际性能提供了可信的蓝图,确保我们的加密通信对所有对手(无论是现在还是未来)都保持机密性。