加法秘密共享是多方安全计算(MPC)领域的密码学原语,其核心逻辑是将秘密数据拆分为无意义的份额(Share):单个份额无法推断原始数据,仅当所有参与方的份额按规则组合时才能恢复秘密,以此在多参与方协同计算中保障数据隐私。
本文基于密码学理论,聚焦加法秘密共享的定义、安全设定与计算过程。
一、核心定义与基础设定
1. 数学基础
加法秘密共享在环Z2l上实现(l 为数据位宽,通常 64 位;部分场景下 20 位用于表示小数),核心是将秘密值 x 拆分为 n 个随机份额(以下主要针对 2 参与方场景,即 n=2),满足 “份额独立无意义,组合可恢复秘密” 的特性。
2. 2 参与方份额拆分规则
对任意秘密值 x,生成两个独立随机份额,分别由参与方 P0、P1 持有:
满足数学关系:
x=⟨x⟩0+⟨x⟩1mod 2l
(实际计算默认遵循环运算规则,省略显式模运算)
3. 份额核心特性
二、安全模型适配
为匹配多参与方协同分析的隐私需求,加法秘密共享采用以下安全设定:
1. 半诚实模型(Semi-honest Adversary Model)
参与方严格遵循协议执行,但可能通过本地份额或中间信息推断数据。该模型适配医疗、金融等 “不主动破坏协议,但需防范隐私泄露” 的场景。
2. 无需 “非共谋假设”
区别于部分三方 MPC 协议(如 ABY3),加法秘密共享即使参与方共谋,也无法通过份额反推原始秘密(随机性掩盖了秘密特征)。
3. 可信第三方(TTP)的有限角色
TTP 仅负责离线生成关联随机性(如乘法所需的 Beaver 三元组),不接触敏感数据;随机性可批量预生成,不影响在线性能,且无法反推秘密。
三、核心计算过程
加法秘密共享支持高效的本地计算与低交互复杂运算,核心包含三类操作:
1. 加法运算(本地计算,无交互)
计算秘密 x 与 y 的和 z=x+y,步骤完全本地化:
前提
x 的份额为 (⟨x⟩0,⟨x⟩1),y 的份额为 (⟨y⟩0,⟨y⟩1),参与方仅持有自身份额。
计算步骤
参与方 Pi(i∈{0,1})本地计算:
⟨z⟩i=⟨x⟩i+⟨y⟩i
正确性验证
⟨z⟩0+⟨z⟩1=(⟨x⟩0+⟨x⟩1)+(⟨y⟩0+⟨y⟩1)=x+y=z
特点
无通信开销,是 SUM、AVG 等聚合运算的核心支撑。
示例
为直观理解加法秘密共享的计算逻辑,以下基于 2 参与方( P0 、 P1 ) 和 环Z24(即位宽l=4,数值范围 0-15,模 16 运算),通过具体数值演示三类核心运算的完整过程。
假设需计算两个秘密值的和:x=5,y=7,目标是通过份额计算得到z=12(因5+7=12<16,模运算无影响)。
步骤 1:拆分x和y的份额
对x=5:随机生成P0的份额⟨x⟩0=3,则⟨x⟩1=5−3=2(满足3+2=5 mod 16)。
对y=7:随机生成P0的份额⟨y⟩0=9,则⟨y⟩1=7−9=14(因7−9=−2,模 16 后为 14,满足9+14=23 mod 16=7)。
最终份额分配:P0持有(⟨x⟩0=3,⟨y⟩0=9),P1持有(⟨x⟩1=2,⟨y⟩1=14)。
步骤 2:本地计算 “和份额”
P0本地计算:⟨z⟩0=⟨x⟩0+⟨y⟩0=3+9=12
P1本地计算:⟨z⟩1=⟨x⟩1+⟨y⟩1=2+14=16
步骤 3:验证正确性
两方份额相加:⟨z⟩0+⟨z⟩1=12+16=28,模 16 后为12,与x+y=12完全一致,计算正确。
2. 标量乘法(本地计算,无交互)
计算秘密 x 与公开标量c(如过滤常数)的乘积 y=c⋅x:
前提
c 为公开值,x 的份额为 (⟨x⟩0,⟨x⟩1)。
计算步骤
参与方 Pi 本地计算:
⟨y⟩i=c⋅⟨x⟩i
正确性验证
⟨y⟩0+⟨y⟩1=c⋅(⟨x⟩0+⟨x⟩1)=c⋅x=y
特点
无交互开销,可用于 “本地数据过滤”,减少后续计算量。
示例
假设需计算秘密值x=6与公开标量c=3的乘积,目标是得到y=18 mod 16=2。
步骤 1:拆分x的份额
对x=6:随机生成P0的份额⟨x⟩0=10,则⟨x⟩1=6−10=12(满足10+12=22 mod 16=6)。
份额分配:P0持有⟨x⟩0=10,P1持有⟨x⟩1=12;标量c=3由两方共同可见。
步骤 2:本地计算 “乘积份额”
P0本地计算:⟨y⟩0=c⋅⟨x⟩0=3×10=30
P1本地计算:⟨y⟩1=c⋅⟨x⟩1=3×12=36
步骤 3:验证正确性
两方份额相加:⟨y⟩0+⟨y⟩1=30+36=66,模 16 后为66−4×16=2,与c⋅x=18 mod 16=2一致,计算正确。
3. 乘法运算(Beaver 三元组辅助,低交互)
乘法需通过Beaver 三元组实现安全计算,步骤如下:
步骤 1:离线生成 Beaver 三元组
TTP 离线生成满足 c=a⋅b 的随机秘密份额:
-
a 的份额:(⟨a⟩0,⟨a⟩1)
-
b 的份额:(⟨b⟩0,⟨b⟩1)
-
c 的份额:(⟨c⟩0,⟨c⟩1)
步骤 2:本地计算中间值
参与方 Pi 计算:
⟨e⟩i=⟨x⟩i−⟨a⟩i,⟨f⟩i=⟨y⟩i−⟨b⟩i
步骤 3:公开中间值
合作恢复无隐私意义的中间值:
e=⟨e⟩0+⟨e⟩1,f=⟨f⟩0+⟨f⟩1
步骤 4:本地生成乘积份额
参与方 Pi 计算最终乘积 z=x⋅y 的份额:
⟨z⟩i=−i⋅e⋅f+f⋅⟨x⟩i+e⋅⟨y⟩i+⟨c⟩i
正确性验证
分别写出⟨z⟩0和⟨z⟩1的表达式
对于 P0(i=0):
⟨z⟩0=−0⋅e⋅f+f⋅⟨x⟩0+e⋅⟨y⟩0+⟨c⟩0=f⋅⟨x⟩0+e⋅⟨y⟩0+⟨c⟩0
对于 P1(i=1):
⟨z⟩1=−1⋅e⋅f+f⋅⟨x⟩1+e⋅⟨y⟩1+⟨c⟩1
将两方份额相加,展开合并
⟨z⟩0+⟨z⟩1=[f⋅⟨x⟩0+e⋅⟨y⟩0+⟨c⟩0]+[−e⋅f+f⋅⟨x⟩1+e⋅⟨y⟩1+⟨c⟩1]=f⋅(⟨x⟩0+⟨x⟩1)+e⋅(⟨y⟩0+⟨y⟩1)+(⟨c⟩0+⟨c⟩1)−e⋅f
代入已知关系化简
由份额定义:⟨x⟩0+⟨x⟩1=x,⟨y⟩0+⟨y⟩1=y
由Beaver三元组:⟨c⟩0+⟨c⟩1=c=a⋅b
代入后:
⟨z⟩0+⟨z⟩1=f⋅x+e⋅y+a⋅b−e⋅f
代入e=x−a、f=y−b,进一步化简
⟨z⟩0+⟨z⟩1=(y−b)⋅x+(x−a)⋅y+a⋅b−(x−a)(y−b)=xy−bx+xy−ay+ab−(xy−bx−ay+ab)=xy−bx+xy−ay+ab−xy+bx+ay−ab=xy
特点
仅需一次轻量交互,避免混淆电路的高开销,支撑分组统计等复杂算子。
示例
假设需计算两个秘密值的乘积:x=4,y=5,目标是得到z=20 mod 16=4。
步骤 1:离线生成 Beaver 三元组(TTP 执行)
TTP 随机生成满足c=a⋅b mod 16的三元组:
TTP 将份额分配给两方:P0持有(⟨a⟩0=7,⟨b⟩0=11,⟨c⟩0=5),P1持有(⟨a⟩1=12,⟨b⟩1=11,⟨c⟩1=13)。
步骤 2:拆分x和y的份额
对x=4:随机生成⟨x⟩0=9,则⟨x⟩1=4−9=11(9+11=20 mod 16=4);
对y=5:随机生成⟨y⟩0=2,则⟨y⟩1=5−2=3(2+3=5 mod 16)。
两方最终持有份额:P0:⟨x⟩0=9,⟨y⟩0=2,三元组份额(7,11,5);P1:⟨x⟩1=11,⟨y⟩1=3,三元组份额(12,11,13)。
步骤 3:本地计算中间值份额
P0计算:⟨e⟩0=⟨x⟩0−⟨a⟩0=9−7=2;⟨f⟩0=⟨y⟩0−⟨b⟩0=2−11=7(2−11=−9 mod 16=7);
P1计算:⟨e⟩1=⟨x⟩1−⟨a⟩1=11−12=15(11−12=−1 mod 16=15);⟨f⟩1=⟨y⟩1−⟨b⟩1=3−11=8(3−11=−8 mod 16=8)。
步骤 4:公开中间值(唯一交互步骤)
两方共享中间值份额,恢复e和f:
- e=⟨e⟩0+⟨e⟩1=2+15=17 mod 16=1;
- f=⟨f⟩0+⟨f⟩1=7+8=15 mod 16=15。
e=1和f=15公开后无隐私风险(仅为 “秘密 - 随机值” 的差值)。
步骤 5:本地生成乘积份额
根据公式⟨z⟩i=−i⋅e⋅f+f⋅⟨x⟩i+e⋅⟨y⟩i+⟨c⟩i:
- P0(i=0):⟨z⟩0=−0×1×15+15×9+1×2+5=0+135+2+5=142;
- P1(i=1):⟨z⟩1=−1×1×15+15×11+1×3+13=−15+165+3+13=166。
步骤 6:验证正确性
两方份额相加:⟨z⟩0+⟨z⟩1=142+166=308,模 16 后为308−19×16=308−304=4,与x⋅y=20 mod 16=4一致,计算正确。
四、补充函数实现
加法秘密共享可扩展实现复杂函数:
1. 比较协议
基于布尔共享(Boolean Sharing)将秘密值拆分为比特级份额,通过 “减法符号判断” 实现 x>y、x=y 等比较,高效计算 MIN/MAX。
2. 非线性函数
结合加法、乘法与泰勒级数展开,实现对数、指数、平方根等函数,适配金融风控(风险权重计算)、医疗分析(指标归一化)等场景。