Skip to content

不经意传输

Oblivious Transfer(OT).

假设 Ob一串字母小姐 有两个秘密 m0m1,要出售给 Doloris小姐一个秘密 mb,但是 Doloris小姐 不想让 Ob一串字母小姐 知道她买的是 m0 还是 m1,而 Ob一串字母小姐 也不想让 Doloris小姐 知道另一个秘密 m1b,这就有了我们下面的第一个协议 OT21

OT^1_2

OT21

Sheme-1

首先,我们假设接收者 B 是诚实的。

  1. SetupB 选定他要选择的秘密 b{0,1},并生成公私钥对 (pkb,skb),然后随机选择一个随机数作为另一个公钥 pk1b,并将 (pk0,pk1) 发送给发送者 A
  2. TransferA 收到公钥对 (pk0,pk1) 后,使用公钥 pk0pk1 分别加密秘密 m0m1,得到密文 c0=Encpk0(m0)c1=Encpk1(m1),然后将密文对 (c0,c1) 发送给接收者 B
  3. ReceiveB 使用私钥 skb 解密密文 cb,得到秘密 mb=Decskb(cb)

显然,B 只能解密他选择的秘密 mb,而无法解密另一个秘密 m1b,同时 A 也无法知道 B 选择的是哪个秘密。

Sheme-2

但是,在上面的协议中,A 无法确保 B 确实没有持有 pk1b 对应的私钥 sk1b,因此我们需要一个更强的协议来确保 B 的诚实性。

以下以 Elgamal 为例:

  1. Setup:对于 A , 生成群参数 (G,p,g),并且再生成一个随机元素 CG , 把四元组 (G,p,g,C) 发送给 B
  2. BindB 选择一个随机数 kZp,并且根据他想要的秘密 b{0,1} 计算公钥对 (pkb=gk,skb=k),然后计算另一个公钥 pk1b=C/pkb(此处不计算也可),并将 pkb 发送给 A
  3. Transfer: 由 A 计算 pk1b=C/pkb。计算 C1=Encpk0(m0)C2=Encpk1(m1),这部分可以用同一个随机数掩码 r 来加密,叫做重用随机数,得到密文对 (C1,C2) 并发送给 B
  4. ReceiveB 使用私钥 skb 解密密文 Cb,得到秘密 mb=Decskb(Cb)

同样也是显然的,B 只能解密他选择的秘密 mb,而无法解密另一个秘密 m1b,同时 A 也无法知道 B 选择的是哪个秘密。并且在这里可以有效防止 B 作恶。

OT^{1}_n

OTn1

利用陷门置换(Trapdoor Permutation)的 OTn1 协议的构造过程:

假设 An 个秘密 a1,a2,,an,想将其中一个传递给 B,使得只有 B 知道 A 传递的是哪个消息,而 A 不知道。

步骤1:秘密的传输

  1. A 将 Trapdoor Permutation f 发送给 B,自己保留 Trapdoor 可用来求出 f 的原像 f1
  2. B 想得到的是秘密 ai(1in),他从 f 的定义域中选取 n 个随机值 x1,x2,,xn,并将 n 元组 y1,y2,,yn 发送给 A,其中yk={xkkif(xk)k=i
  3. A 利用 Trapdoor 计算 zk=f1(yk),k=1,2,,n,并将 zkak 发送给 B (k=1,2,,n)。

步骤2:秘密的恢复(假设B是半诚实的)

因为 B 知道 xi,故 B 可通过计算 (ziai)xi=ai 得到秘密 ai,而 A 不知道 B 拿到了哪个秘密。

什么叫半诚实的?

半诚实 (Semi-Honest) 模型,也称为 诚实但好奇 (Honest-but-Curious) 模型。

在此模型中,假设参与者(这里指 B)会:

  1. 诚实地 遵守协议的所有步骤(例如:在步骤 1 中,对于 ki,B 确实是随机选取 xk,而不是精心构造的:简单地说,就是对于 ki 我仍然使得 yk=f(xk)
  2. 好奇地 尝试从收到的消息中推断出额外的隐私信息。

如果 B 是 恶意 (Malicious) 的,他可以在步骤 1 中作弊:对于 ki,他可以先选定 wk,计算 yk=f(wk) 发送给 A。A 会计算 zk=f1(yk)=wk 并发送 wkak。因为 B 知道 wk,他就能解密出所有的秘密 ak。 因此,该协议仅在 B 是半诚实的前提下是安全的。