公钥可搜索加密(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-CKA | IND-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体系的整体结构图,展示各模块的联系。面试里这张图可以帮你解释清楚全流程。
这张图从左到右展示了数据发送者(Alice)生成密文,数据接收者(Bob)生成陷门,两者都传输给服务器(Cloud)。服务器使用两次配对计算完成搜索验证。
真的要注意:当你向面试官解释PEKS流程时,不要只说“发送者加密、接收者搜索”这种空话。你要把配对的角色讲清楚:“两次配对验证的是e(陷门, 密文第一分量) == e(生成元, 密文第二分量)这个关系。因为双线性性,如果关键词匹配,这两边相等,否则在概率多项式时间内不可区分。”这个深度,面试官会记住你。
PEKS 的面试,说白了,就是看你是否理解“双线性配对的安全性与性能的折中”。我做了这么多年的安全方案,最后的经验只有一句话:选对配对曲线和哈希方法,比改算法更重要。面试时你要是把这个道理解释清楚,再加上一个实际踩坑的例子,其他候选人基本不是你的对手。