Skip to content

算法Algorithm

可验证不经意伪随机函数

Verifiable oblivious pseudorandom function · VOPRF

对固定P256公钥重建RFC9497单元素DLEQ挑战,只有盲求值响应通过同钥匙检查才允许去盲输出。

形式陈述 ​

在基本OPRF中,客户端看见 V,却无法知道服务器是否真的计算了预期的 kU。可验证版本先固定一个经过可信途径获得的公钥 K=kG,再检查两对点 (G,K) 与 (U,V) 使用了相同标量。证明有效只相对于这个 K;若攻击者可以同时换掉公钥和证明,检查并未认证原来的服务器。

本页固定RFC9497 P256-SHA256模式1、一个公钥、一个请求。群、规范点和标量编码沿用OPRF页;模式上下文改为 OPRFV1-、单字节 01、-P256-SHA256 的拼接,所以两模式的哈希到群不同。证明是两个规范标量 (c,s),各32字节大端,共64字节。[1]

先绑定本次点对,再形成挑战 ​

写 fr(b)=I2OSP(|b|,2)‖b,E(P) 为33字节压缩点。HashToScalar用SHA-256-XMD扩展48字节,以大端整数模群阶 q;其DST为 HashToScalar- 加模式1上下文。下面所有定长整数均为大端。

RFC即使在单元素输入上也先计算组合系数。令

σ=SHA256(fr(E(K))‖fr(Seed-‖context)),d=Hs(fr(σ)‖I2OSP(0,2)‖fr(E(U))‖fr(E(V))‖Composite),M=dU,N=dV.

本页受限参考接口在 d=0 时明确拒绝,不把它改为1,也不更改消息后重新散列。这样 M≠O,且 N=kM 等价于 V=kU。这是在正常RFC字节流程外加入的失败关闭边界;本程序不实现任意批量及所有退化输入的完整RFC接口。

服务器取新鲜非零随机标量 a,计算 T2=aG,T3=aM,再形成

C=fr(E(K))‖fr(E(M))‖fr(E(N))‖fr(E(T2))‖fr(E(T3))‖Challenge,c=Hs(C),s=a−ck(modq).

这里 Hs 的下标表示“输出标量”的公开函数,不是秘密钥匙。c,s 可以为零;只有私钥、盲因子和证明随机数必须非零。非零随机数约定遵循Verified Erratum8392。[2]

客户端验收顺序 ​

客户端保留本地 (x,r,U)。它验证输入编码并重新计算 d,M,N,由证明恢复

T^2=sG+cK,T^3=sM+cN.

受限接口在任何重建点为 O 时拒绝。其余情况下,用同一长度前缀和顺序重新生成挑战,只有 Hs(C^)=c 才继续。最后核本地请求确为 U=rH1(x),去盲 r−1V 并Finalize。任一失败都返回错误,不释放一个未经核验的结果。

诚实且 d≠0 时,N=kM,所以

T^2=(a−ck)G+ckG=aG,T^3=(a−ck)M+ckM=aM.

因此重建的挑战输入逐字相同,证明通过。非零 a 与非单位 M 保证这两点不是 O。

直觉

公钥说“钥匙把 G 变成了 K”;求值响应则说“同一钥匙把 U 变成了 V”。DLEQ证明让这两句话共享一个隐含标量,而不发送标量本身。组合系数把当前公钥与点对装进RFC规定的上下文,单元素时仍不能删掉这一层后拿标准证明直接比较。

Fiat–Shamir将随机挑战换成包含公开陈述和两个临时点的哈希。验证器并不是从一个点解出私钥,而是检查响应能否重建当初被挑战绑定的同一份记录。

单元素VOPRF的同钥匙检查
例子与边界

一份64字节证明如何重放 ​

RFC Appendix A.3.2.1仍使用输入单字节 00,但模式改变后派生钥匙、盲点和输出都改变。公开钥匙与线上点为

text
K = 03e17e70604bcabe198882c0a1f27a92441e774224ed9c702e51dd17038b102462
U = 02dd05901038bb31a6fae01828fd8d0e49e35a486b5c5d4b4994013648c01277da
V = 0209f33cab60cf8fe69239b0afbcfcd261af4c1c5632624f2e9ba29b90ae83e4a2
c = e7c2b3c5c954c035949f1f74e6bce2ed539a3be267d1481e9ddb178533df4c26
s = 64f69d065c604a4fd953e100b856ad83804eb3845189babfa5a702090d6fc5fa

参考程序计算的组合系数为

text
d = 46968348700845572112859460244973300238657689773219820355681679294538105038972

重建的两个临时点是

text
T2 = 036b6b7568a58a57a28e5064a81bfcf3ec929d4adba5b89d6959e34b4382d32815
T3 = 0365c79ae57490f9b1cc35f9ddfd94518a904ff09157cd30eaa0e4b8c73c30c318

五个带长度的33字节点,加九字节 Challenge,共184字节。验证通过后得到

text
0412e8f78b02c415ab3a288e228978376f99927767ff37c5718d420010a645a1

不要要求它等于模式0的输出:两个模式的哈希域已经不同。公开测试用私钥和随机数仅用于复算,不能复用为线上秘密。

真实改变验收责任 ​

保持同一个请求 U 和客户端固定的 K,让服务器用另一非零钥匙 k′ 回答 V′=k′U。基本OPRF能去盲并得到某个函数值;本页验证器则不能接受服务器为 k′G 生成的证明。若客户端把固定公钥也一并替换成 k′G,证明可再次通过,但它检查的是另一个函数。

单元素的零系数不是一个可忽略不写的代码分支:d=0 会使 M=N=O,当前响应关系消失。参考器用可注入的散列桩触达这个分支,确认明确报错;此桩只用于测试,不替代实际HashToScalar。截短证明、c≥q、非曲线响应、错模式或错本地请求同样不能输出结果。

证明随机数不得复用。两条不同挑战下若用了同一个 a,有 s=a−ck、s′=a−c′k,从公开记录即可得到

k=(s−s′)(c′−c)−1(modq).

标准向量中重复公开随机数方便对照;它们同时公开私钥,属于测试资料,不是随机数管理的示范。

推论与应用

两响应提取证明了什么 ​

固定 K,M,N,T2,T3,若两个不同挑战 c≠c′ 都有合法响应 s,s′,相减得到

(c′−c)K=(s−s′)G,(c′−c)N=(s−s′)M.

由于 q 为素数,非零 c′−c 可逆,上述 k 同时满足 K=kG,N=kM;再因 d≠0,推出 V=kU。这是同一首消息下的特殊可靠性,不是从一份线上证明提取私钥的算法。

交互式诚实验证者模拟也可以直接构造:先均匀选 c,s∈Fq,按验证式生成 T2,T3,若 T2=O 就重抽。对真关系,映射 a=s+ck 是双射,条件 T2≠O 正好等于 a≠0;因此所得完整记录与非零 a 的真实分布相同,期望抽样次数为 q/(q−1)。这里模拟的是交互均匀挑战,非交互哈希版本还需要随机预言机编程等模型,不能直接套用同一句结论。

错误关系在理想挑战下的逐查询界 ​

考虑一个单独、明确的模型:不同挑战字节串得到独立随机384位整数,再模 q;组合系数等其他接口可以自适应调用,但挑战接口与它们域分离。一次挑战的最大点概率为

η=⌈2384/q⌉2384≤1q+2−384.

对任何固定错误关系 K=kG,N=nM,有 k≠n。这里只在证明中写离散对数,验证程序不求它。将任意固定临时点写为 T2=aG,T3=bM,接受等式要求

a=s+ck,b=s+cn,a−b=c(k−n).

因此在一次全新挑战查询发生之前,它的字节串至多有一个能使这份错误关系成功的挑战值。即使攻击者自适应形成每次新陈述,条件于此前视图,该次命中概率仍至多 η。若它最多作 QH 次挑战查询,最后再提交一份证明,则由并集界,错误关系接受概率至多

(QH+1)η.

加一覆盖最终提交从未查询过的挑战字节串。重复查询不会提供新的独立机会。这个小定理证明指定理想挑战模型下的关系可靠性;它既不证明客户端输入隐藏,也不证明服务器函数伪随机,更不自动成为现实SHA-256的定理。

安全范围、费用与终点 ​

RFC9497 §7.2.1对其协议变体明确保留多钥匙/批处理的分析边界。本页只执行单公钥单元素,不把上述关系界扩成完整多会话协议定理。原JKK14协议的sid、理想功能和双哈希输入另有规定;引用原论文时应保持这些条件。[3]

验证阶段不依赖原消息长度:计算种子和系数后,用两次标量乘得到 M,N,再用四次标量乘及两次点加恢复临时点,最后散列固定长度记录。参考 finalize_verified 还重新计算本地请求、做去盲和Finalize,需额外计哈希到曲线、两次标量乘、一次标量逆及 O(|x|+1) 字节工作。每次倍加乘法的位数和仿射求逆成本沿用OPRF页;Python实现不满足秘密运算常时要求。

终点任务:逐字重放上面证明;在固定公钥下替换服务器钥匙,确认没有Finalize输出;然后连同公钥一起换掉,说明它为何再次通过而没有认证原身份。最后对两个合法点对复用一次公开教学随机数,计算泄出的 k,并解释为何“每份证明单独都有效”不能保护复用随机数。完整任务见盲求值与公钥核验练习。

参考资料
  1. Alex Davidson等,RFC9497,2023-12,§§2.2.1–2.2.2、3.3.2、4.3、7.2.1、7.4及Appendix A.3.2:组合输入、证明字节、重建、范围与常时要求。
  2. RFC Editor,Verified Erratum8392,2026-01-27:随机标量必须非零;挑战及响应标量的规范区间仍包括零。
  3. Stanislaw Jarecki、Aggelos Kiayias、Hugo Krawczyk,Round-Optimal Password-Protected Secret Sharing and T-PAKE in the Password-Only Model,扩展版§3.1,Figure3与Theorem1,PDF pp.9–10;原始同离散对数证明和协议安全模型。本文单元素错误关系的逐查询论证另外显式固定了挑战模型。
关系图谱6 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系