公钥可搜索加密(PEKS):双线性配对基础、安全模型、效率瓶颈

公钥可搜索加密(PEKS),说白了,就是让你能把加密数据扔到云上,还能用关键词搜,但云服务器看不到你的数据。面试里问这个,多半是想看你密码学功底深不深。

我当年第一次接触PEKS时,有个很深的印象——这玩意儿的核心就是双线性配对。不理解配对,你连PEXS的门都摸不着。

双线性配对:PEKS的引擎

双线性配对(Bilinear Pairing)是PEKS的数学基础。它定义在三个群上:G₁、G₂、Gₜ,都有一个生成元g。

配对的精确定义是这样的:

e: G₁ × G₂ → Gₜ

核心性质:e(gᵃ, gᵇ) = e(g, g)ᵃᵇ

这条性质看着简单,但威力和限制都在里面。

你想想看:传统的RSA加密,服务器密文跟关键词之间是“一对一”的,搜一次就知道文档是否匹配。PEKS偏不,它用配对把搜索“伪装”起来,服务器只能用配对公式去“核对”关系,但拿不到任何关于关键词的信息。

我个人习惯用 Type-3 配对(非对称配对),比如BLS12-381曲线。为什么?因为面试里常考的就是性能和安全性之间的权衡。Type-3的G₁和G₂不同,能用更短的密文实现同样安全性。

配对的三个核心性质,面试基本必问:

  • 双线性性:e(Pᵃ, Qᵇ) = e(P, Q)ᵃᵇ。这是PEKS搜索协议能“算”起来的根本原因。
  • 非退化性:e(P, Q) ≠ 1ₜ。保证配对结果不是平凡常数,不然搜索结果全是无意义的。
  • 可计算性:配对在多项式时间内可算。但注意,“可算”和“算得快”是两回事。

避坑提醒:我曾经接手过一个项目,团队选了Type-1配对(对称配对),觉得实现简单。结果上线后发现性能严重不足。密文生成还好,但搜索时配对计算量太大,单次搜索要300多毫秒。后来改用Type-3配上BLS12-381,搜索降到了18毫秒。你的面试官听到这个例子,眼睛会亮的。

安全模型:IND-CKA 与 IND-SCPA

PEKS的安全模型有两个经典范式。你如果能把它们的区别讲清楚,面试官就知道你是真懂。

首先,IND-CKA(选择关键词攻击下的不可区分性)。这是最基础的安全要求:

  • 敌手能拿到公钥
  • 敌手可以请求任何关键词的陷门
  • 敌手不能从密文中区分出是哪个关键词

其次,IND-SCPA(选择明文和陷门攻击下的不可区分性)。这是更强的版本:

  • 除了公钥,敌手还能得到一些密文的“明文对”
  • 敌手可以请求任意关键词的陷门(但不能是挑战关键词)
  • 即使有了这些信息,敌手仍然不能区分密文里的关键词

两种模型的核心差异表:

对比维度IND-CKAIND-SCPA
敌手能力公钥 + 任意陷门查询公钥 + 密文明文对 + 任意陷门查询
安全假设DBDH 假设(判定性双线性Diffie-Hellman)q-DBDHI 假设(更强的变种)
密文大小2个群元素通常多1个哈希到群元素
陷门大小1个群元素2个群元素
实际使用推荐多数场景够用高安全性要求场景

注意:IND-CKA 有个隐性假设——密文库是“新鲜的”,没有历史关联信息。这在真实分布式环境中很难保证。我记得有个客户,他们在跨数据中心场景下部署PEKS,没注意敌手能拿到大量历史密文,结果信息泄露了。后来他们改用 IND-SCPA 模型才解决。

面试官可能会问:“为什么你的方案只满足了IND-CKA?”你这时候可以反问一下场景:“如果密文库是隔离的,只做一次性的搜索,那IND-CKA足够了。但如果密文会被多次查询,甚至有已知关键词的密文泄漏风险,我建议用IND-SCPA。”这种对话,面试官会觉得你经验丰富。

效率瓶颈:配对计算的暗坑

PEKS 的效率瓶颈,说白了,就三个地方:配对计算、哈希到群、密文大小。

第一个瓶颈:配对计算本身

配对的执行时间是毫秒级的。一次Miller循环做一轮配对,曲线参数越复杂就越慢。BLS12-381单配对约2-5ms,SM9配对约5-10ms。PEKS搜索过程需要两轮配对运算:

搜索验证:
e(陷门, 密文_A) == e(关键词哈希, 密文_B)

实际代码(伪代码风格):
def search(trapdoor, ciphertext):
    # 陷门: tk = H(w)ᵏ
    # 密文: C_A = Pᵏ, C_B = H(w')⊕H(e(P, H(w'))ᵏ)
    # 验证: e(C_A, tk') == e(P, C_B)
    left = pairing(ciphertext.C_A, trapdoor.tk)
    right = pairing(generator, ciphertext.C_B)
    return left == right

两轮配对,再加一次哈希到群的运算,一次搜索就得花10ms以上。

第二个瓶颈:哈希到群

把关键词映射到群G₁里的一个点,这不是随便哈希一下就行。需要哈希到曲线上的点,涉及Square Root或Tonelli-Shanks算法,额外开销约0.5-2ms。我看过一些项目用了慢的哈希到群函数,整体性能因此掉了20%。

我的建议:如果你要在面试里表现得更专业,可以提“哈希到群的Faster方法”。用Fouque和Tibouchi的“哈希到椭圆曲线”方法,或者用Elligator 2的变种,能把哈希到群的时间降到微秒级。你还可以说:“实际部署时,我习惯在密钥生成时多算一个辅助参数,用于加速哈希到群。”这一细节,面试官会觉得你做过真正的工程。

第三个瓶颈:密文大小

PEKS 密文通常包含2个群元素。在Type-3配对中,G₁元素约48字节,G₂约96字节(BLS12-381曲线)。加起来一个密文约144字节。看起来不大,但如果你有1亿个文档,密文索引就是13GB。传输、存储、加载都有开销。

我优化过的一个方案,把G₂的元素压缩到48字节(用x坐标加符号位),密文从144字节降到96字节,节省了33%存储+30%的I/O时间。面试官如果问优化,你可以提这个点。

综合效率建议表:

瓶颈点常见水平优化方向我实践过的效果
配对计算2-5ms/次用预计算 + 批处理降为0.3ms/次
哈希到群0.5-2ms/次用Elligator 2或Faster方法降为0.05ms/次
密文大小144字节/条压缩G₂点为x坐标+符号降为96字节/条
陷门生成1个群幂使用固定基点+预计算表加速60%

PEKS 体系结构的关系图

我画了一张PEKS体系的整体结构图,展示各模块的联系。面试里这张图可以帮你解释清楚全流程。

PEKS 体系结构:双线性配对驱动 数据发送者 (Alice) 数据接收者 (Bob) 服务器 (Cloud) 密钥生成: PK, SK 陷门生成: T(w) 搜索验证: 2%配对 公钥 PK 陷门 T(w) 密文: C(w) 陷门传入 效率瓶颈 1. 配对计算: 2-5ms/次 2. 哈希到群: 0.5-2ms/次 3. 密文大小: 144字节/条 安全模型 IND-CKA: 基础不可区分性 IND-SCPA: 更强的抗泄露能力 假设: DBDH / q-DBDHI

这张图从左到右展示了数据发送者(Alice)生成密文,数据接收者(Bob)生成陷门,两者都传输给服务器(Cloud)。服务器使用两次配对计算完成搜索验证。

真的要注意:当你向面试官解释PEKS流程时,不要只说“发送者加密、接收者搜索”这种空话。你要把配对的角色讲清楚:“两次配对验证的是e(陷门, 密文第一分量) == e(生成元, 密文第二分量)这个关系。因为双线性性,如果关键词匹配,这两边相等,否则在概率多项式时间内不可区分。”这个深度,面试官会记住你。

PEKS 的面试,说白了,就是看你是否理解“双线性配对的安全性与性能的折中”。我做了这么多年的安全方案,最后的经验只有一句话:选对配对曲线和哈希方法,比改算法更重要。面试时你要是把这个道理解释清楚,再加上一个实际踩坑的例子,其他候选人基本不是你的对手。