Beaver三元组
Beaver三元组(Beaver Triple)主要用于安全多方计算协议中的乘法计算。它的应用范围为加法和乘法均为线性的秘密分享机制。
用[∗]表示秘密被分享之后的状态,如[𝑎]表示秘密𝑎已经通过秘密分享函数被分享给了参与者,如果有n个参与者,则[𝑎] = {\( 𝑎_1,𝑎_2,…,𝑎_𝑛 \)}。假设秘密共享函数为𝑓(𝑥),𝑥为待共享的秘密,参与者为\( 𝑃_1,𝑃_2,…,𝑃_𝑛 \),参与者\( 𝑃_𝑖 \)拿到的𝑥的子秘密记为\( 𝑥_𝑖 \)。
假设需要分享的秘密为𝑎、𝑏,参与者𝑃𝑖获得的𝑎、𝑏的子秘密为\( 𝑎_𝑖、𝑏_𝑖 \)。
加法秘密分享机制为线性的意思为:存在一组常数\( \lambda _1,\lambda _2,...,\lambda _n\),使得:
将其抽象简记为:
\( [a+b]=[a]+[b] \)
乘法秘密分享机制为线性的意思为:存在一组常数\( \lambda _1,\lambda _2,...,\lambda _n \),使得:
将其抽象简记为:
Beaver Multiplication的主要流程为:
在协议开始之前预先产生一个随机三元组:
其中𝑎和𝑏对所有参与者保密,𝑐满足𝑐=𝑎∙𝑏。假设秘密𝑥和𝑦已经被分享,现在需要计算 [𝑥𝑦] 。
- 所有参与者公开 [𝛼],[𝛼]=[𝑥]−[𝑎]
- 所有参与者公开 [𝛽],[𝛽] = [𝑦]−[𝑏]
- 所有参与者计算 [𝑧]=[𝑐]+𝛼∙[𝑏]+𝛽∙[𝑎]+𝛼∙𝛽
因为 [𝛼] 和 [𝛽] 已公开,因此所有参与者都可以通过秘密重构函数独立计算出𝛼和𝛽。又因为:
由于[𝑎],[𝑏],[𝑐]是预先产生和分配的三元组,因此在乘法计算时参与者只需要本地计算[𝛼]=[𝑥]−[𝑎]和[𝛽]=[𝑦]−[𝑏],并对计算结果[𝛼]和[𝛽]进行公开。
而对于上次叙述的BGW协议,在计算乘法时,需要每一个参与者计算[𝑎]∙[𝑏],之后对[𝑎]∙[𝑏]进行秘密共享,将子秘密分别发送给其他所有参与者。
Beaver三元组是消耗性,每次乘法计算都会消耗一个Beaver三元组,通过预先计算的Beaver三元组,将通信量和计算量移到了协议开始之前。
BMR协议
之前介绍的姚氏混淆电路只支持双方计算,BMR(Beaver-Micali-Rogaway)协议将姚氏混淆电路扩充到了多方情景。
混淆电路的加密由一方对每条导线的真实输入值生成一个随机加密值,并根据每个门的真值表生成对应的加密表来实现。
因此如果直接把混淆电路协议扩展到多方,由一方对整个电路进行加密,或者对电路的一部分门进行加密,那么当加密方与参与者中的某个求值方进行串通或者这两者的信息都被收买时,就会破坏协议的安全性。
为了安全性,需要让所有参与者共同生成所有导线的加密值和门的加密真值表。
具体而言,需要每个参加者随机生成每条导线的加密值,之后将自己生成的加密值进行掩盖后提交到多方计算协议,协议将每个参与者提交的关于同一条导线加密值进行异或,得到多方协同生成的布尔电路中该条导线的加密值。
BMR协议具体如下:
首先协议根据需要实现的目标函数生成布尔电路𝒞,并向所有参与者公开。将电路𝒞中的各条导线分别标记为\( 𝑤_1,𝑤_2,…,𝑤_t \)。协议参与者为\( 𝑃_1,𝑃_2,…,𝑃_𝑛 \),其输入分别为\( 𝑥_1,𝑥_2,…,𝑥_𝑛 \)∈ {0,1}。
对于电路𝒞中的每一条导线\( 𝑤_𝑖 \),参与者\( 𝑃_𝑗 \)随机产生导线\( 𝑤_𝑖 \) 的真值 0,1对应的随机值,分别记为
\( p_{i, j}^{b} \)满足\( p_{i, j}^{b}=1-p_{i, j}^{1-b} \),即\( k_{i, j}^{b} \)为𝑙比特的随机比特串,\( p_{i, j}^{b} \)为1比特的随机比特。再产生一个随机翻转比特𝑓𝑖,𝑗∈{0,1}。对于每一条导线,参与者\( 𝑃_𝑖 \)计算
因为 \( p_{i, j}^{b}=1-p_{i, j}^{1-b} \), 因此只需要发送p_{i, j}^{0}或者p_{i, j}^{1}就可。函数𝐹()可看作是哈希函数,其将𝑙位的输入扩展为𝑛∙(𝑙+1)位,𝑛是参与者数量。
对于布尔电路𝒞中的每一个门\( 𝐺_𝑖 \),所有参与者共同参与一个计算乱码表的多方安全计算协议。该协议的输入是每个参与者之前计算的\( 𝑆_{𝑖,𝑗} \)和参与者的输入 \( 𝑥_1,𝑥_2,…,𝑥_𝑛 \)。该协议的目标为:
假设电路𝒞中门\( 𝐺_𝑖 \)的输入导线为\( 𝑤_𝑎, 𝑤_𝑏 \),输出导线为\( 𝑤_𝑐 \)。门\( 𝐺_𝑖 \)实现的函数为\( 𝑤_𝑐= 𝑔(𝑤_𝑎,𝑤_𝑏) \)。
计算指针比特:
并设置:
同理,对所有参加者提交的翻转比特求异或,
得到翻转比特\( 𝑓_𝑎,𝑓_𝑏,𝑓_𝑐 \),翻转比特用于掩盖参与者\( 𝑃_𝑖 \)的输入,使得\( 𝑃_𝑖 \)无法得知其对每条导线加密值的具体贡献。
接着创建门\( 𝐺_𝑖 \)的乱码表,让\( 𝑣_𝑎, 𝑣_𝑏 \)分别是导线\( 𝑤_𝑎, 𝑤_𝑏 \), 的输入,对于\( 𝐺_𝑖 \)输入\( 𝑣_𝑎,𝑣_𝑏 \)∈{0,1},一共只有四种可能的组合。
让\( 𝑣_𝑐 \)是导线\( 𝑤_𝑐 \)的真实输出值,\( 𝑒_{𝑣𝑎,𝑣𝑏} \)是导线\( 𝑤_𝑐 \)的加密值。设定
即\( 𝑒_{𝑣𝑎,𝑣𝑏} \)共有四个可能的值,如下表所示:
其中\( w_{c}^{b}=w_{c, 1}^{b}|\cdots| w_{c, n}^{b} | p_{c}^{b}, b \in{0,1} \),即将各个\( w_{c, 1}^{b} \)和\( p_{c}^{b} \), 进行级联。之后对乱码表中\( 𝑒_{𝑣𝑎,𝑣𝑏} \)的条目进行重新排序,并将条目\( 𝑒_{𝑣𝑎,𝑣𝑏} \)放在\( \left(p_{a}^{v_{a}}, p_{b}^{v^{b}}\right) \)的位置上。
向参与者\( 𝑃_1 \)输出计算得到的乱码表,向\( 𝑃_1 \)发送各个参与方的输入\( 𝑥_1,𝑥_2,…,𝑥_𝑛 \)所对应的电路𝒞的加密导线值。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。