隐私计算-基础理论-加法秘密分享

60 阅读3分钟

加法秘密共享是多方安全计算(MPC)领域的密码学原语,其核心逻辑是将秘密数据拆分为无意义的份额(Share):单个份额无法推断原始数据,仅当所有参与方的份额按规则组合时才能恢复秘密,以此在多参与方协同计算中保障数据隐私。

本文基于密码学理论,聚焦加法秘密共享的定义、安全设定与计算过程。

一、核心定义与基础设定

1. 数学基础

加法秘密共享在环Z2l\mathbb{Z}_{2^l}上实现(ll 为数据位宽,通常 64 位;部分场景下 20 位用于表示小数),核心是将秘密值 xx 拆分为 nn 个随机份额(以下主要针对 2 参与方场景,即 n=2n=2),满足 “份额独立无意义,组合可恢复秘密” 的特性。

2. 2 参与方份额拆分规则

对任意秘密值 xx,生成两个独立随机份额,分别由参与方 P0P_0P1P_1 持有:

  • P0P_0 持有份额 x0\langle x \rangle_0

  • P1P_1 持有份额 x1\langle x \rangle_1

满足数学关系:

x=x0+x1mod 2l x = \langle x \rangle_0 + \langle x \rangle_1 \quad \text{mod } 2^l

(实际计算默认遵循环运算规则,省略显式模运算)

3. 份额核心特性

  • 随机性:份额由随机算法生成,与原始秘密 xx 无直接关联,单独持有无法推断 xx 的任何信息。

  • 隐私性:原始秘密仅存在于 “所有份额的组合” 中,参与方仅访问自身份额,从根本上避免单点泄露。

二、安全模型适配

为匹配多参与方协同分析的隐私需求,加法秘密共享采用以下安全设定:

1. 半诚实模型(Semi-honest Adversary Model)

参与方严格遵循协议执行,但可能通过本地份额或中间信息推断数据。该模型适配医疗、金融等 “不主动破坏协议,但需防范隐私泄露” 的场景。

2. 无需 “非共谋假设”

区别于部分三方 MPC 协议(如 ABY3),加法秘密共享即使参与方共谋,也无法通过份额反推原始秘密(随机性掩盖了秘密特征)。

3. 可信第三方(TTP)的有限角色

TTP 仅负责离线生成关联随机性(如乘法所需的 Beaver 三元组),不接触敏感数据;随机性可批量预生成,不影响在线性能,且无法反推秘密。

三、核心计算过程

加法秘密共享支持高效的本地计算与低交互复杂运算,核心包含三类操作:

1. 加法运算(本地计算,无交互)

计算秘密 xxyy 的和 z=x+yz = x + y,步骤完全本地化:

前提

xx 的份额为 (x0,x1)(\langle x \rangle_0, \langle x \rangle_1)yy 的份额为 (y0,y1)(\langle y \rangle_0, \langle y \rangle_1),参与方仅持有自身份额。

计算步骤

参与方 PiP_ii{0,1}i \in \{0,1\})本地计算:

zi=xi+yi \langle z \rangle_i = \langle x \rangle_i + \langle y \rangle_i

正确性验证

z0+z1=(x0+x1)+(y0+y1)=x+y=z \langle z \rangle_0 + \langle z \rangle_1 = (\langle x \rangle_0 + \langle x \rangle_1) + (\langle y \rangle_0 + \langle y \rangle_1) = x + y = z

特点

无通信开销,是 SUM、AVG 等聚合运算的核心支撑。

示例

为直观理解加法秘密共享的计算逻辑,以下基于 2 参与方( P0P_0 P1P_1 Z24\mathbb{Z}_{2^4}(即位宽l=4l=4,数值范围 0-15,模 16 运算),通过具体数值演示三类核心运算的完整过程。

假设需计算两个秘密值的和:x=5x=5y=7y=7,目标是通过份额计算得到z=12z=12(因5+7=12<165+7=12 < 16,模运算无影响)。

步骤 1:拆分xxyy的份额

x=5x=5:随机生成P0P_0的份额x0=3\langle x \rangle_0=3,则x1=53=2\langle x \rangle_1 = 5 - 3 = 2(满足3+2=5 mod 163+2=5\ \text{mod}\ 16)。

y=7y=7:随机生成P0P_0的份额y0=9\langle y \rangle_0=9,则y1=79=14\langle y \rangle_1 = 7 - 9 = 14(因79=27-9=-2,模 16 后为 14,满足9+14=23 mod 16=79+14=23\ \text{mod}\ 16=7)。

最终份额分配:P0P_0持有(x0=3,y0=9)(\langle x \rangle_0=3, \langle y \rangle_0=9)P1P_1持有(x1=2,y1=14)(\langle x \rangle_1=2, \langle y \rangle_1=14)

步骤 2:本地计算 “和份额”

P0P_0本地计算:z0=x0+y0=3+9=12\langle z \rangle_0 = \langle x \rangle_0 + \langle y \rangle_0 = 3 + 9 = 12

P1P_1本地计算:z1=x1+y1=2+14=16\langle z \rangle_1 = \langle x \rangle_1 + \langle y \rangle_1 = 2 + 14 = 16

步骤 3:验证正确性

两方份额相加:z0+z1=12+16=28\langle z \rangle_0 + \langle z \rangle_1 = 12 + 16 = 28,模 16 后为1212,与x+y=12x+y=12完全一致,计算正确。

2. 标量乘法(本地计算,无交互)

计算秘密 xx 与公开标量cc(如过滤常数)的乘积 y=cxy = c \cdot x

前提

cc 为公开值,xx 的份额为 (x0,x1)(\langle x \rangle_0, \langle x \rangle_1)

计算步骤

参与方 PiP_i 本地计算:

yi=cxi \langle y \rangle_i = c \cdot \langle x \rangle_i

正确性验证

y0+y1=c(x0+x1)=cx=y \langle y \rangle_0 + \langle y \rangle_1 = c \cdot (\langle x \rangle_0 + \langle x \rangle_1) = c \cdot x = y

特点

无交互开销,可用于 “本地数据过滤”,减少后续计算量。

示例

假设需计算秘密值x=6x=6与公开标量c=3c=3的乘积,目标是得到y=18 mod 16=2y=18\ \text{mod}\ 16=2

步骤 1:拆分xx的份额

x=6x=6:随机生成P0P_0的份额x0=10\langle x \rangle_0=10,则x1=610=12\langle x \rangle_1 = 6 - 10 = 12(满足10+12=22 mod 16=610+12=22\ \text{mod}\ 16=6)。

份额分配:P0P_0持有x0=10\langle x \rangle_0=10P1P_1持有x1=12\langle x \rangle_1=12;标量c=3c=3由两方共同可见。

步骤 2:本地计算 “乘积份额”

P0P_0本地计算:y0=cx0=3×10=30\langle y \rangle_0 = c \cdot \langle x \rangle_0 = 3 \times 10 = 30

P1P_1本地计算:y1=cx1=3×12=36\langle y \rangle_1 = c \cdot \langle x \rangle_1 = 3 \times 12 = 36

步骤 3:验证正确性

两方份额相加:y0+y1=30+36=66\langle y \rangle_0 + \langle y \rangle_1 = 30 + 36 = 66,模 16 后为664×16=266 - 4 \times 16 = 2,与cx=18 mod 16=2c \cdot x=18\ \text{mod}\ 16=2一致,计算正确。

3. 乘法运算(Beaver 三元组辅助,低交互)

乘法需通过Beaver 三元组实现安全计算,步骤如下:

步骤 1:离线生成 Beaver 三元组

TTP 离线生成满足 c=abc = a \cdot b 的随机秘密份额:

  • aa 的份额:(a0,a1)(\langle a \rangle_0, \langle a \rangle_1)

  • bb 的份额:(b0,b1)(\langle b \rangle_0, \langle b \rangle_1)

  • cc 的份额:(c0,c1)(\langle c \rangle_0, \langle c \rangle_1)

步骤 2:本地计算中间值

参与方 PiP_i 计算:

ei=xiai,fi=yibi \langle e \rangle_i = \langle x \rangle_i - \langle a \rangle_i, \quad \langle f \rangle_i = \langle y \rangle_i - \langle b \rangle_i

步骤 3:公开中间值

合作恢复无隐私意义的中间值:

e=e0+e1,f=f0+f1 e = \langle e \rangle_0 + \langle e \rangle_1, \quad f = \langle f \rangle_0 + \langle f \rangle_1

步骤 4:本地生成乘积份额

参与方 PiP_i 计算最终乘积 z=xyz = x \cdot y 的份额:

zi=ief+fxi+eyi+ci \langle z \rangle_i = -i \cdot e \cdot f + f \cdot \langle x \rangle_i + e \cdot \langle y \rangle_i + \langle c \rangle_i

正确性验证

分别写出z0\langle z \rangle_0z1\langle z \rangle_1的表达式

对于 P0P_0i=0i=0):

z0=0ef+fx0+ey0+c0=fx0+ey0+c0 \langle z \rangle_0 = -0 \cdot e \cdot f + f \cdot \langle x \rangle_0 + e \cdot \langle y \rangle_0 + \langle c \rangle_0 = f \cdot \langle x \rangle_0 + e \cdot \langle y \rangle_0 + \langle c \rangle_0

对于 P1P_1i=1i=1):

z1=1ef+fx1+ey1+c1 \langle z \rangle_1 = -1 \cdot e \cdot f + f \cdot \langle x \rangle_1 + e \cdot \langle y \rangle_1 + \langle c \rangle_1

将两方份额相加,展开合并

z0+z1=[fx0+ey0+c0]+[ef+fx1+ey1+c1]=f(x0+x1)+e(y0+y1)+(c0+c1)ef\begin{align*} \langle z \rangle_0 + \langle z \rangle_1 &= \left[ f \cdot \langle x \rangle_0 + e \cdot \langle y \rangle_0 + \langle c \rangle_0 \right] + \left[ -e \cdot f + f \cdot \langle x \rangle_1 + e \cdot \langle y \rangle_1 + \langle c \rangle_1 \right] \\ &= f \cdot (\langle x \rangle_0 + \langle x \rangle_1) + e \cdot (\langle y \rangle_0 + \langle y \rangle_1) + (\langle c \rangle_0 + \langle c \rangle_1) - e \cdot f \end{align*}

代入已知关系化简

由份额定义:x0+x1=x\langle x \rangle_0 + \langle x \rangle_1 = xy0+y1=y\langle y \rangle_0 + \langle y \rangle_1 = y

由Beaver三元组:c0+c1=c=ab\langle c \rangle_0 + \langle c \rangle_1 = c = a \cdot b

代入后:

z0+z1=fx+ey+abef\langle z \rangle_0 + \langle z \rangle_1 = f \cdot x + e \cdot y + a \cdot b - e \cdot f

代入e=xae = x - af=ybf = y - b,进一步化简

z0+z1=(yb)x+(xa)y+ab(xa)(yb)=xybx+xyay+ab(xybxay+ab)=xybx+xyay+abxy+bx+ayab=xy\begin{align*} \langle z \rangle_0 + \langle z \rangle_1 &= (y - b) \cdot x + (x - a) \cdot y + a \cdot b - (x - a)(y - b) \\ &= xy - bx + xy - ay + ab - \left( xy - bx - ay + ab \right) \\ &= xy - bx + xy - ay + ab - xy + bx + ay - ab \\ &= xy \end{align*}

特点

仅需一次轻量交互,避免混淆电路的高开销,支撑分组统计等复杂算子。

示例

假设需计算两个秘密值的乘积:x=4x=4y=5y=5,目标是得到z=20 mod 16=4z=20\ \text{mod}\ 16=4

步骤 1:离线生成 Beaver 三元组(TTP 执行)

TTP 随机生成满足c=ab mod 16c = a \cdot b\ \text{mod}\ 16的三元组:

  • a=3a=3b=6b=6,则c=3×6=18 mod 16=2c=3 \times 6 = 18\ \text{mod}\ 16=2

  • 拆分份额:

    • a=3a=3a0=7\langle a \rangle_0=7a1=37=12\langle a \rangle_1=3-7=127+12=19 mod 16=37+12=19\ \text{mod}\ 16=3);
    • b=6b=6b0=11\langle b \rangle_0=11b1=611=11\langle b \rangle_1=6-11=1111+11=22 mod 16=611+11=22\ \text{mod}\ 16=6);
    • c=2c=2c0=5\langle c \rangle_0=5c1=25=13\langle c \rangle_1=2-5=135+13=18 mod 16=25+13=18\ \text{mod}\ 16=2)。

TTP 将份额分配给两方:P0P_0持有(a0=7,b0=11,c0=5)(\langle a \rangle_0=7, \langle b \rangle_0=11, \langle c \rangle_0=5)P1P_1持有(a1=12,b1=11,c1=13)(\langle a \rangle_1=12, \langle b \rangle_1=11, \langle c \rangle_1=13)

步骤 2:拆分xxyy的份额

x=4x=4:随机生成x0=9\langle x \rangle_0=9,则x1=49=11\langle x \rangle_1=4-9=119+11=20 mod 16=49+11=20\ \text{mod}\ 16=4);

y=5y=5:随机生成y0=2\langle y \rangle_0=2,则y1=52=3\langle y \rangle_1=5-2=32+3=5 mod 162+3=5\ \text{mod}\ 16)。

两方最终持有份额:P0P_0x0=9\langle x \rangle_0=9y0=2\langle y \rangle_0=2,三元组份额(7,11,5);P1P_1x1=11\langle x \rangle_1=11y1=3\langle y \rangle_1=3,三元组份额(12,11,13)。

步骤 3:本地计算中间值份额

P0P_0计算:e0=x0a0=97=2\langle e \rangle_0 = \langle x \rangle_0 - \langle a \rangle_0 = 9 - 7 = 2f0=y0b0=211=7\langle f \rangle_0 = \langle y \rangle_0 - \langle b \rangle_0 = 2 - 11 = 7211=9 mod 16=72-11=-9\ \text{mod}\ 16=7);

P1P_1计算:e1=x1a1=1112=15\langle e \rangle_1 = \langle x \rangle_1 - \langle a \rangle_1 = 11 - 12 = 151112=1 mod 16=1511-12=-1\ \text{mod}\ 16=15);f1=y1b1=311=8\langle f \rangle_1 = \langle y \rangle_1 - \langle b \rangle_1 = 3 - 11 = 8311=8 mod 16=83-11=-8\ \text{mod}\ 16=8)。

步骤 4:公开中间值(唯一交互步骤)

两方共享中间值份额,恢复eeff

  • e=e0+e1=2+15=17 mod 16=1e = \langle e \rangle_0 + \langle e \rangle_1 = 2 + 15 = 17\ \text{mod}\ 16=1
  • f=f0+f1=7+8=15 mod 16=15f = \langle f \rangle_0 + \langle f \rangle_1 = 7 + 8 = 15\ \text{mod}\ 16=15

e=1e=1f=15f=15公开后无隐私风险(仅为 “秘密 - 随机值” 的差值)。

步骤 5:本地生成乘积份额

根据公式zi=ief+fxi+eyi+ci\langle z \rangle_i = -i \cdot e \cdot f + f \cdot \langle x \rangle_i + e \cdot \langle y \rangle_i + \langle c \rangle_i

  • P0P_0i=0i=0):z0=0×1×15+15×9+1×2+5=0+135+2+5=142\langle z \rangle_0 = -0 \times 1 \times 15 + 15 \times 9 + 1 \times 2 + 5 = 0 + 135 + 2 + 5 = 142
  • P1P_1i=1i=1):z1=1×1×15+15×11+1×3+13=15+165+3+13=166\langle z \rangle_1 = -1 \times 1 \times 15 + 15 \times 11 + 1 \times 3 + 13 = -15 + 165 + 3 + 13 = 166

步骤 6:验证正确性

两方份额相加:z0+z1=142+166=308\langle z \rangle_0 + \langle z \rangle_1 = 142 + 166 = 308,模 16 后为30819×16=308304=4308 - 19 \times 16 = 308 - 304 = 4,与xy=20 mod 16=4x \cdot y=20\ \text{mod}\ 16=4一致,计算正确。

四、补充函数实现

加法秘密共享可扩展实现复杂函数:

1. 比较协议

基于布尔共享(Boolean Sharing)将秘密值拆分为比特级份额,通过 “减法符号判断” 实现 x>yx > yx=yx = y 等比较,高效计算 MIN/MAX。

2. 非线性函数

结合加法、乘法与泰勒级数展开,实现对数、指数、平方根等函数,适配金融风控(风险权重计算)、医疗分析(指标归一化)等场景。