问题简述
两个百万富翁都想比较到底谁更富有,但是有都不想让别人知道自己有多少钱。在没有可信的第三方的情况下如何进行?这就是著名的姚式百万赴富翁问题。
抽象并简化问题,假设Alice有一个整数i,公钥Eb,私钥Db。Bob有一个整数j,且
i
,
j
∈
[
1
,
10
]
i,j\in [1,10]
i,j∈[1,10]
协议流程
1.Bob选择一个大随机数x,用Alice的公钥加密:
C
=
E
b
(
x
)
C = Eb(x)
C=Eb(x),将
C
T
=
C
−
j
CT = C - j
CT=C−j发送给Alice;
2.Alice收到数据后,计算
Y
u
=
D
b
(
C
T
+
u
)
,
u
∈
[
1
,
10
]
Y_{u} = Db(CT + u),u\in [1,10]
Yu=Db(CT+u),u∈[1,10],选取一个大素数p(p比x稍小),计算
Z
u
=
Y
u
m
o
d
p
Z_{u} = Y_{u} mod p
Zu=Yumodp
3.Alice将
[
Z
1
,
Z
2
,
⋯
,
Z
i
,
Z
i
+
1
+
1
,
Z
i
+
2
+
1
,
⋯
,
Z
10
+
1
]
[Z_1,Z_2,\cdots,Z_{i},Z_{i+1}+1,Z_{i+2}+1,\cdots,Z_{10}+1]
[Z1,Z2,⋯,Zi,Zi+1+1,Zi+2+1,⋯,Z10+1]发送给Bob;
4.Bob查看
Z
j
Z_{j}
Zj是否等于
x
(
m
o
d
p
)
x (modp)
x(modp),若等于,则
i
≥
j
i \geq j
i≥j,否则
i
<
j
i < j
i<j,将结果告知Alice;
简单分析
选取一个大素数,尽管Alice得到CT,要猜测j也是困难的;
Alice计算
Z
u
Z_{u}
Zu后,从第i+1个位置开始,每个元素的值加上1,将序列发给Bob;
Bob解密后只关心第j个位置,因为
Z
j
=
C
T
+
j
=
C
−
j
+
j
=
E
b
(
x
)
Z_{j} = CT+j = C-j + j= Eb(x)
Zj=CT+j=C−j+j=Eb(x)(假设Bob得到的序列没有加1);
假设
i
<
j
i<j
i<j,则
Z
j
Z_{j}
Zj肯定是被加上了1,即是说
Z
i
≠
x
(
m
o
d
p
)
Z_{i} \neq x (modp)
Zi=x(modp);假设
i
≥
j
i \geq j
i≥j,则
Z
j
Z_{j}
Zj的值就没有变,即是说
Z
i
=
x
(
m
o
d
p
)
Z_{i} = x (modp)
Zi=x(modp);