最近在调研PSI协议,突然悟到一点:PSI过程中对明文的编码处理,需要参与方共同参与计算,任何一方不可以有能力单独计算明文的编码结果,否则会发生隐私泄露。
例如,两个参与方的PSI场景,A和B分别有数据 X={x1, x2,…xn}、Y={y1, y2,… ym},最简单直接的想法是,利用哈希算法H进行求交,即A和B分别计算 H(X) = {H(x1), H(x2)… H(xn)} 和 H(Y) = {H(y1), H(y2)… H(ym)},通过对比哈希结果来找到交集。
若A方有其他未参与求交的数据 S={s1, s2,… sk},则可单独计算 H(S) = {H(s1), H(s2)… H(sk)},对比H(S)和H(Y)获得更多的求交结果,从而产生隐私泄露。
再者,ECDH-PSI协议中,ECC的基点为G,A和B分别持有私钥 skA 和 skB,明文 x 的编码为 C(x) = HashToPoint(x)*skA*skB,需要两方用各自私钥分别执行一次编码计算。
该协议不可以简单粗暴地使用 C(x)=(x*G)*skA*skB,因为A只需通过一个交集数据 x,就可计算出 skB*G = C * (skA)^{-1} * x^ {-1},其中(skA)^{-1} 和 x^{-1} 分别为 skA 和 x 的逆元。若A方有其他未参与求交的数据 S={s1, s2,… sk},对于每个si,可单独计算 si 的编码 C(si) = si*skA*(skB*G),则A可以额外获得S和Y的交集数据,产生隐私泄露。