不经意传输
不经意传输(Oblivious Transfer,OT)是一种密码学协议,它解决了以下问题:
我们假设 Alice 有两个数值
v
0
v_0
v0和
v
1
v_1
v1,Bob想知道其中的一个。通过执行 OT协议,Bob知道了
v
i
v_i
vi,但不知道
v
1
−
i
v_{1-i}
v1−i,同时,Alice不知道
i
i
i。举一个例子,Alice这儿有两个产品的折扣码,Bob 想获得其中一个。但 Bob 又比较注重隐私,不想让 Alice 知道他选择了哪一个。这时候,他们就可以通过 OT 来完成交易。
现在我们来看一看基于 OT 的实现方式。我们考虑
- Alice拥有值 v 0 v_0 v0, v 1 v_1 v1和密钥 s s s, r 0 r_0 r0, r 1 r_1 r1
- Bob拥有值 i ∈ { 0 , 1 } i\in\{0,1\} i∈{0,1}和密钥 k k k,Bob想获得 v i v_i vi
- Alice和Bob事先统一 g ∈ Z p g\in Z_p g∈Zp,其中 g g g是一个大整数, p p p是一个大质数
那么 OT 协议可以通过如下演绎
-
A
l
i
c
e
→
B
o
b
:
g
s
Alice\to Bob:g^s
Alice→Bob:gs
因为离散对数问题不存在高效解法,Bob知道 g g g和 g s g^s gs也无法破译 s s s。 - Bob基于 i i i生成 L i = { g k , i = 0 g s − k , i = 1 L_i=\begin{cases}g^k,&i=0\\g^{s-k},&i=1\end{cases} Li={gk,gs−k,i=0i=1
-
B
o
b
→
A
l
i
c
e
:
L
i
Bob\to Alice:L_i
Bob→Alice:Li
因为离散对数问题不存在高效解法,Alice知道 g g g和 g k g^k gk也无法破译 k k k。因此,Alice无法知道Bob发来的是 g k g^k gk还是 g s − k g^{s-k} gs−k,也就无法知道 i i i。 - Alice生成
C
0
C_0
C0,
C
1
C_1
C1
a. C 0 = ( g r 0 , ( L i ) r 0 ⊕ v 0 ) C_0=(g^{r_0},(L_i)^{r_0}\oplus v_0) C0=(gr0,(Li)r0⊕v0)
b. C 1 = ( g r 1 , ( g s L i ) r 1 ⊕ v 1 ) C_1=(g^{r_1},(\frac{g^s}{L_i})^{r_1}\oplus v_1) C1=(gr1,(Ligs)r1⊕v1)
其中 ⊕ \oplus ⊕表示异或操作 -
A
l
i
c
e
→
B
o
b
:
C
0
,
C
1
Alice\to Bob:C_0,C_1
Alice→Bob:C0,C1
因为离散对数问题不存在高效解法,Bob知道 g g g, g r 0 g^{r_0} gr0, g r 1 g^{r_1} gr1也无法破译 r 0 r_0 r0, r 1 r_1 r1。 - Bob解密
v
i
v_i
vi
a. 当 i = 0 i=0 i=0时,Bob可以通过以下方式获得 v 0 v_0 v0而获得不了 v 1 v_1 v1。
C 0 [ 0 ] k ⊕ C 0 [ 1 ] = ( g r 0 ) k ⊕ ( L i ) r 0 ⊕ v 0 = ( g r 0 ) k ⊕ ( g k ) r 0 ⊕ v 0 = v 0 C_0[0]^k\oplus C_0[1]=(g^{r_0})^k\oplus (L_i)^{r_0}\oplus v_0=(g^{r_0})^k\oplus (g^k)^{r_0}\oplus v_0=v_0 C0[0]k⊕C0[1]=(gr0)k⊕(Li)r0⊕v0=(gr0)k⊕(gk)r0⊕v0=v0
C 1 [ 1 ] = ( g s L i ) r 1 ⊕ v 1 = g ( s − k ) r 1 ⊕ v 1 C_1[1]=(\frac{g^s}{L_i})^{r_1}\oplus v_1=g^{(s-k)r_1}\oplus v_1 C1[1]=(Ligs)r1⊕v1=g(s−k)r1⊕v1,因为Bob不知道 s s s和 r 1 r_1 r1,所以Bob无法得到 v 1 v_1 v1。
b. 当 i = 1 i=1 i=1时,Bob可以通过以下方式获得 v 1 v_1 v1而获得不了 v 0 v_0 v0。
C 1 [ 0 ] k ⊕ C 1 [ 1 ] = ( g r 1 ) k ⊕ ( g s L i ) r 1 ⊕ v 1 = ( g r 1 ) k ⊕ ( g k ) r 1 ⊕ v 1 = v 1 C_1[0]^k\oplus C_1[1]=(g^{r_1})^k\oplus (\frac{g^s}{L_i})^{r_1}\oplus v_1=(g^{r_1})^k\oplus (g^k)^{r_1}\oplus v_1=v_1 C1[0]k⊕C1[1]=(gr1)k⊕(Ligs)r1⊕v1=(gr1)k⊕(gk)r1⊕v1=v1
C 0 [ 1 ] = ( g s − k ) r 0 ⊕ v 0 = g ( s − k ) r 0 ⊕ v 0 C_0[1]=(g^{s-k})^{r_0}\oplus v_0=g^{(s-k)r_0}\oplus v_0 C0[1]=(gs−k)r0⊕v0=g(s−k)r0⊕v0,因为Bob不知道 s s s和 r 0 r_0 r0,所以Bob无法得到 v 0 v_0 v0。
除了上述实现,OT 还有多种实现方法。