量子就绪:混合密钥交换
继我们之前关于签名混合的文章之后,本文涵盖了混合密钥交换的基础知识,以确保数据的最大安全性。
目录
- 快速回顾:定义
- 组合KEM
- 经验教训
比数字签名方案更紧迫的是,我们在互联网上交换共享秘密的方式需要过渡到后量子时代。由于对新的“后量子”密钥交换方案的认识相对不足,大多数机构鼓励使用混合方案,将知名经典方案的鲁棒性与新方案提供的后量子保护相结合。这篇博客文章详细介绍了混合密钥交换的主要概念现状。
快速回顾:定义
密钥封装机制
将某物称为密钥封装机制(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):Encaps 可以看作一个临时Diffie-Hellman密钥交换。首先选择一个随机整数 x,然后计算相关的公钥,它将作为你的胶囊 caps = g ** x,以及共享秘密 secret = K_pub ** xDecaps(caps, K_priv):Decaps 简单地计算临时公钥和我们自己私钥之间的密钥交换。secret = caps ** K_priv
混合
混合是将后量子和经典方案结合起来,以获得一种新的、对经典和量子攻击都更具弹性的方案的做法。更多细节,我们之前关于混合签名的博客文章中已经涵盖了更完整的定义。如果您还没有阅读,我们鼓励您阅读。
组合KEM
F. Giacon、F. Heuer 和 B. Poettering 在2018年的一篇研究论文中深入研究了KEM组合器。在本文中,他们介绍了一种组合器的一般构造,其中所有密钥交换并行执行。实际的组合工作最后进行,作为所有共享秘密、胶囊和公钥的函数 W,输出组合的共享秘密。
在以下部分,我们研究这样的函数,并深入探讨它们为何可能或可能不是合适的选择。
拼接共享秘密
在组合多个秘密为一个时,一个人可能采取的第一种方法是简单地将它们全部拼接起来。
|
|
然而,有几个原因说明这可能不是最好的做法:
- 最终共享秘密的长度随组合KEM的数量及其输出大小而变化
- 如果其中一个KEM被破解,最终共享秘密将部分为攻击者所知。因此,它将不再完全是“秘密”的
理想情况下,破解我们组合器中除一个KEM外的所有KEM不应提供足够信息来猜测最终共享秘密的部分。直观上,我们希望我们的KEM将每个KEM带来的熵扩散到最终共享秘密的所有位。
拼接共享秘密,然后哈希
根据之前关于熵扩散的经验,人们可以想到以下组合器作为下一个迭代:
这个组合器拼接然后对组件KEM的共享秘密执行密钥派生操作(例如使用哈希函数)以形成最终共享秘密。这确保了在熵方面,每个输出位都依赖于每个输入位。然而,在我们理想的组合器必须“至少与每个成分KEM一样好”的世界里,这仍然不足。
为了进一步证明这一点,让我们检查“会话密钥不可区分性”的概念(在两篇IACR论文中讨论过)。它描述了对手在给定相应胶囊的情况下,区分共享秘密和随机二进制大对象的能力。
会话密钥不可区分性可以看作是猜测“盒子里是什么?”,给定两个可能的答案。
我们将在这里涵盖两个级别的会话密钥不可区分性:
- 针对选择明文攻击的不可区分性(IND-CPA):挑战者提供一个公钥、一个胶囊、其关联的共享秘密和一个随机二进制大对象。对手可以访问一个Encaps预言机,他们可以随意调用,使用任何他们选择的公钥。在某一时刻,对手必须决定提供的两个二进制大对象中哪一个是提供的胶囊包装的共享秘密。
- 针对选择密文攻击的不可区分性(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不是IND-CCA,而KEM_X是IND-CCA。
请注意,像前面演示中KEM_Y那样具有碰撞的KEM可以通过Diffie-Hellman密钥交换实例化,给定较差的参数选择:
|
|
如您所见,对于给定的胶囊和选择不当的私钥,可以在此方案中立即找到碰撞胶囊。
尽管如此,根据M. Barbosa等人的说法,如果您能证明组件KEM的密文第二原像抵抗性,那么“拼接然后哈希”的组合是安全的。这个属性在我们的例子中显然没有得到尊重,因为KEM_Y是专门设计来提供碰撞的,因此导致了所得KEM的IND-CCA崩溃。
拼接共享秘密和胶囊,然后哈希
对于一般情况,M. Campagna & A. Petcher 2020年的论文提出将每个KEM的胶囊和公钥纳入混合。这个增加允许防御前一段中提出的攻击,因为碰撞胶囊的最终共享秘密现在将不同。然而,后量子算法的胶囊和密钥比经典算法大得多。因此,这种构造带来了不可忽视的开销,形式是对密钥派生函数调用的更大输入。
为了避免这种性能缺陷,IETF的Composite ML-KEM草案提出了不同的方法。通过证明ML-KEM具有密文第二原像抵抗性,他们可以安全地从KDF输入中省略庞大的ML-KEM胶囊和公钥。这种方法在保持所需IND-CCA安全性的同时,没有性能损失。
|
|
IETF的Composite ML-KEM中使用的组合器函数。Domain是一个常量,用于指示已组合的特定算法对。
经验教训
混合密钥交换提供了一条谨慎的前进道路,融合了经典算法经过时间考验的安全性和后量子方案面向未来的特性。然而,本文证明了用于组合这些方案的方法与方案本身同样关键。我们已经看到,简单的共享秘密拼接是不足的,甚至更直观的“拼接然后哈希”方法也可能引入细微的漏洞。
要构建真正有弹性的混合KEM,有两条主要路径:
- 通用构造,不仅将共享秘密,还将每个KEM的胶囊和公钥纳入最终的密钥派生函数。这是更安全的路径,但由于后量子构件的大尺寸,可能会带来显著的性能成本。
- 更优化的方法,例如IETF为Composite ML-KEM采取的方法,依赖于证明组件KEM更强的安全属性,例如密文第二原像抵抗性。这允许一种更简化的组合,从哈希中省略庞大的后量子胶囊和密钥,在不牺牲安全性的情况下实现高性能。
总之,设计安全的混合机制是一项细致入微的任务,无论是对于签名还是密钥交换。开发人员应依赖标准化和严格分析的构造,例如IETF提出的那些,而不是依赖直觉发明自定义解决方案。这些标准为实现高安全性和实际性能提供了可信的蓝图,确保我们的加密通信对所有对手(当前和未来)保持机密。