隐私计算秘密学-秘密分享

1 背景

留学文书隐私保护
最近几年,基于法律法规对于用户隐私的立法以及用户对于隐私的认知增强,对于数据的“采 传 存 算的模式”都提出了巨大的考验与挑战,甚至以往的数据运作模式都存在被颠覆的可能,需要相应的前瞻性布局,因此这几年隐私计算技术的发展如火如荼,各大公司争相投入重兵。

  • 在欧洲,2016 年发布、2018 年开始强制执行的《通用数据保护条例》(General Data Protection Regulation, GDPR)涵盖范围广、保护要求严格,甫一推行就引发了科技公司的密切关注。
  • 美国统一法律委员会(ULC)投票通过了《统一个人数据保护法》,这是一项旨在统一州隐私立法的示范法案。经过最终修订后,该法案预计将在2022年1月被州立法机构引入。
  • 《数安法》出台后将成为以《国家安全法》为代表的国家安全法律体系的重要组成部分,也将与《网络安全法》及目前已经二次审议的《个人信息保护法》一起组成信息领域更加完整的基础性法律体系。
  • 经过三次审议,十三届全国人大常委会第三十次会议表决通过了《中华人民共和国个人信息保护法》,并于2021年11月1日起施行。确立个人信息保护原则、规范处理活动保障权益、禁止“大数据杀熟”规范自动化决策、严格保护敏感个人信息、赋予个人充分权利等。新规施行后,违法的主体将最高可处五千万以下或者上一年度营业额百分之五以下的罚款
  • 前不久,阿里达摩院发布了2022十大科技趋势,全域隐私计算强势上榜。
  • 百度研究院发布了2022年的十大科技趋势预测,其中提到,隐私计算技术备受关注,将成为数据价值释放的突破口和构建信任的基础设施

2 隐私计算全貌

可以看到,隐私计算技术从1979年就开始了,历经四代从安全多方计算、到差分隐私、到TEE,再到最近火的不能再火的联邦学习。这些隐私技术都是各个学科的综合应用,我大致列举下:

  • 大数据技术
  • 实时计算技术
  • 密码学技术:同态加密、秘密分享、不经意传输、
  • 机器学习算法与框架
  • 高并发等

本文主要介绍密码学相关知识 - 秘密分享,力争用简洁明了的语言把问题与解法表达清晰,如果与写的不妥的地方,请大家多多包涵。

3 问题提出

  • 问题描述

例如假设一家公司对所有支票进行数字签名(参见RSA)。如果给每个高管一份公司秘密签名密钥的副本,那么这个系统会非常方便,但是很容易被误用。如果需要公司所有高管的配合才能签署每张支票,那么这个系统是安全的,但是不方便。有时候需要进行折中,比如解决方案要求每次授权支票至少需要三个高管联合进行签名,用(3,n)的门限阈值方案实现。那么一名不忠的高管必须至少有两个同伙,才能在该计划中伪造公司的签名进行支票的获取。

  • 问题分析
    从上面的描述中,我们可以得到两种保密的模式
    • 严格的模式:需要所有的参与方同时参加,才能撬动整个流程的运转。
    • 阈值的模式:不需要所有的参与方同时参加,但是需要一定的门限阈值,实现(k ,N)的门限阈值同时表决,进而撬动整个流程的运转。
  • 问题关键
    • 割裂性:每个分片参与方都不会有完整的秘密,需要其他的参与方共同参与计算表决。
    • 表决性:针对严格的秘密分享需要全部参与方参与计算表决,针对阈值的秘密分享需要达到相应阈值数量的参与方参与运算表决。少于规定数量的参与方无法运算表决。

4 Secret Sharing

上面的方式适合于隐私计算的基础技术: Secret Shareing,那么接下来,我就和大家介绍下这门技术。

Secret Sharing 翻译成中文就是“秘密分享”或者“秘密共享”,通常大家都称为秘密分享。大概就是说有一个秘密,如一个整数 D,不希望泄露。同时有 N 个人,如果每个人都知道 这个秘密D,那么这个D就不是秘密,也就不安全了。但是如果 把D进行切分随机的分给N个人,要用到的时候需要N个人的部分信息聚合到一起,才能解密D 的值,那么是安全的。但是这种方案比较脆弱,如果一个人不在了,这个秘密就真成了无法探知的秘密了。所以为了健壮性。设计了一种新的模式,在这种模式下,不需要所有的人一起解密,只需要一定的人数K(1 < K < N)就可以解密,这个是1979 年发表在 ACM Communication 杂志的一个解法。

所以,可以将秘密分享分为两类:

  • 严格的秘密分享:需要所有人一起解密;
  • 阈值的秘密分享:不需要所有人,只需要满足一定人数,就可以解密;

基于秘密分享的架构如下,各个分片可以是云服务厂商的云服务

4.1 严格秘密分享

秘密分享按照分片参与者的情况,可以分为两大分类,严格的秘密分享与阈值的秘密分享,下面分别介绍下。

4.1.1 Additive Secret Sharing 加法秘密共享

  • 计算逻辑
    • 首先,用户A和B作为数据的持有方,用户C需要知道用户A和用户B的数字的和,但是A和B不想告知C各自持有的值。
    • 然后,选择N个分片Server(可以是第三方的云服务),并且用户A和用户B将各自持有的x和y,随机切分成N份x划分为 [ [ x ] ] 1 、 [ [ x ] ] 2 . . . [ [ x ] ] n [[x]]_1、[[x]]_2 ... [[x]]_n [[x]]1[[x]]2...[[x]]n,y划分为 [ [ y ] ] 1 、 [ [ y ] ] 2 . . . [ [ y ] ] n [[y]]_1、[[y]]_2 ... [[y]]_n [[y]]1[[y]]2...[[y]]n并且分配给 S 1 、 S 2 . . . S n S_1、S_2 ... S_n S1S2...Sn
    • 然后,用户C向各个分片Server请求和计算算子,各个分片分别求和 S 1 、 S 2 . . . S n 分 别 计 算 [ [ x ] ] 1 + [ [ y ] ] 1 、 [ [ z ] ] 2 = [ [ x ] ] 2 + [ [ y ] ] 2 . . . [ [ z ] ] n = [ [ x ] ] n + [ [ y ] ] n S_1、S_2 ... S_n分别计算 [[x]]_1 + [[y]]_1、[[z]]_2 = [[x]]_2 + [[y]]_2 ... [[z]]_n = [[x]]_n + [[y]]_n S1S2...Sn[[x]]1+[[y]]1[[z]]2=[[x]]2+[[y]]2...[[z]]n=[[x]]n+[[y]]n
    • 然后,用户C收集n个分片参与者的 [ [ z ] ] 1 、 [ [ z ] ] 2 . . . [ [ z ] ] n [[z]]_1、[[z]]_2 ... [[z]]_n [[z]]1[[z]]2...[[z]]n,并且结算求和。
    • 最终,用户C获得了用户A和用户B的两个数字的和,但是用户A和用户B的数据并没有泄露,用户C并且不知道这两个值。

4.1.2 Mulplication On Two Additive Shares 使用随机数添加的乘法运算

  • 协议算法,摘自论文 STR: Secure Computation on Additive Shares Using the Share-Transform-Reveal Strategy

  • 计算逻辑
    • 首先,用户A和B作为数据的持有方,用户C需要知道用户A和用户B的数字的乘积,但是A和B不想告知C各自持有的值。

    • 然后,选择N个分片Server(可以是第三方的云服务),并且用户A和用户B将各自持有的x和y,随机切分成N份x划分为 [ [ x ] ] 1 、 [ [ x ] ] 2 . . . [ [ x ] ] n [[x]]_1、[[x]]_2 ... [[x]]_n [[x]]1[[x]]2...[[x]]n,y划分为 [ [ y ] ] 1 、 [ [ y ] ] 2 . . . [ [ y ] ] n [[y]]_1、[[y]]_2 ... [[y]]_n [[y]]1[[y]]2...[[y]]n并且分配给 S 1 、 S 2 . . . S n S_1、S_2 ... S_n S1S2...Sn

    • 然后,需要一个随机添加的两个数字a和b,以及ab的乘积c,这个可以由一个第三方的组织提供(仅仅提供数字,用户A、B、C都不知晓。)

    • 然后,选择同样的N个分片Server(可以是第三方的云服务),并且添加的数字a,b,c(c=a*b),随机切分成N份,a划分为 [ [ a ] ] 1 、 [ [ a ] ] 2 . . . [ [ a ] ] n [[a]]_1、[[a]]_2 ... [[a]]_n [[a]]1[[a]]2...[[a]]n,b划分为 [ [ b ] ] 1 、 [ [ b ] ] 2 . . . [ [ b ] ] n [[b]]_1、[[b]]_2 ... [[b]]_n [[b]]1[[b]]2...[[b]]n,c划分为 [ [ c ] ] 1 、 [ [ c ] ] 2 . . . [ [ c ] ] n [[c]]_1、[[c]]_2 ... [[c]]_n [[c]]1[[c]]2...[[c]]n并且分配给 S 1 、 S 2 . . . S n S_1、S_2 ... S_n S1S2...Sn

    • 然后,对于公式z=xy,进行转换, z = x y = ( x − a + a ) ( y − b + b ) = ( e + a ) ( f + b ) = e ∗ f + e ∗ b + f ∗ a + a ∗ b z = xy = (x - a + a)(y - b + b) = (e + a)(f + b) = e * f + e *b + f * a + a * b z=xy=(xa+a)(yb+b)=(e+a)(f+b)=ef+eb+fa+ab,其中$e = x -a、f = y - b $ 。

    • 然后,用户C通过个参与者分片Server,联合计算出e和f,此时e和f就属于公开的数字了。

      各个分片计算 [ [ e ] ] i = [ [ x ] ] i − [ [ a ] ] i [[e]]_i = [[x]]_i - [[a]]_i [[e]]i=[[x]]i[[a]]i,然后用户C进行求和,求解出e;

      各个分片计算 [ [ f ] ] i = [ [ y ] ] i − [ [ b ] ] i [[f]]_i = [[y]]_i - [[b]]_i [[f]]i=[[y]]i[[b]]i,然后用户C进行求和,求解出f;

    • 最后,对于最终的求解 z = x y = e ∗ f + e ∗ b + f ∗ a + a ∗ b z = xy = e * f + e *b + f * a + a * b z=xy=ef+eb+fa+ab ,需要各个参与者分片Server计算公开值

      e ∗ f e * f ef,两个公开的数字乘积,无需参与者分片Server联合计算,即可获取解密数据;

      e ∗ b e * b eb,一个公开的数字乘以一个秘密数字,需要每个分片乘以公开数字,即每个参与者计算 [ [ b ] ] i ∗ e [[b]]_i * e [[b]]ie,然后又用户C进行汇总求和,即可获取解密数据;

      f ∗ a f * a fa,一个公开的数字乘以一个秘密数字,需要每个分片乘以公开数字,即每个参与者计算 [ [ a ] ] i ∗ f [[a]]_i * f [[a]]if,然后又用户C进行汇总求和,即可获取解密数据。

      a ∗ b a * b ab,也就是c的值,由于c的值通过秘密分享的方式分配给各个参与者分片,只需要进行加法秘钥分享即可获取,即各个分片获取 [ [ c ] ] i [[c]]_i [[c]]i,然后又用户C进行汇总求和,即可获取解密数据。

      最后,C将获得的上述部分进行累加,就获得了用户A与用户B各自持有数字的乘积,而没有泄露用户A与用户B的具体值。

4.1.3 复杂运算

从上面的例子中,我们已经实现了基于SS的加法与乘法的秘密分享,那么理论上基于加法和乘法我们是可以计算出其他所有的运算的,包括指数 对数等计算,以下就不展开讲了。

4.2 阈值秘密分享

4.2.1 思考与分析

阈值秘密分享的基本思路是,基于秘密分享的便携性与安全性的考量,如果有个n个秘密分片,我们只需要凑齐 k( 1 < K <n )个人,他们手中的信息拼凑起来,就可以获取秘密。

那么如何才能做到这点呢?有以下几个问题需要考虑;

  • 随机性:挑选的k个人,需要是随机挑选的k个人,不能是一个固定的选取。
  • 必然性:随机选出的这k个人,必须能够将需要的数字进行解密。

那么,是什么样的技术可以实现呢?

大家还记得学习《线性代数》的时候吧,在线性代数的课上,k个参与者,相当于k个变量,那么需要k个方程就才可以解出来。

4.2.2 计算逻辑

秘密数字:D;

参与方:n个参与者, D 1 , D 2 , . . . , D n D_1, D_2, ...,D_n D1,D2,...Dn

一个大的素数:p,约束这个素数要大于D和n

  • 首先,构造出n个方程式,构造公式 D i = q ( i ) = ∑ j = 0 j = k − 1 a j ∗ i j D_i = q(i) = \sum_{j=0}^{j=k-1}a_j * i^j Di=q(i)=j=0j=k1ajij,这个公式是从文章How to Share a Secret里面分析的,说白了就是多项式,列举如下:

    • 公式展开: D i = q ( i ) = D + a 1 ∗ i + . . . + a k − 1 ∗ i k − 1 D_i = q(i) = D + a_1 * i + ... + a_{k-1} * i^{k-1} Di=q(i)=D+a1i+...+ak1ik1,其中 a 0 = D a_0 = D a0=D

    • 公式举例(假设k为3,n为10)

      D 1 = q ( 1 ) = D + a 1 + a 2 D_1 = q(1) = D + a_1 + a_2 D1=q(1)=D+a1+a2 , 其 中 ,其中 a_0 = D$;

      D 2 = q ( 2 ) = D + 2 a 1 + 4 a 2 D_2 = q(2) = D + 2a_1 + 4a_2 D2=q(2)=D+2a1+4a2 , 其 中 ,其中 a_0 = D$;

      D 10 = q ( 10 ) = D + 10 a 1 + 100 a 2 D_{10} = q(10) = D + 10a_1 + 100a_2 D10=q(10)=D+10a1+100a2 , 其 中 ,其中 a_0 = D$;

  • 然后,目前的方程组里面,还有 a 1 − − a k − 1 a_1 -- a_{k-1} a1ak1的(k-1)个变量,那么这几个变量如何获取呢?根据Adi Shamir在ACM发布的《How to Share a Secret 》的描述, The coefficients $a_1 … a_{k-1} in q(x) are randomly chosen from a uniform distribution over the integers in [0, p), 也就是说在[0,p)的范围内均匀分布中进行获取。

  • 然后,原始文章中也对 D 1 , D 2 , . . . , D n D_1, D_2, ...,D_n D1,D2,...Dn进行了约束是大素数的取模,不过这理解这个大素数的p的作用更多是控制我们选择 a 1 − − a k − 1 a_1 -- a_{k-1} a1ak1的大小的,防止数据的过于膨胀(唯一解的问题,在构造的时候基本可以规避,大家可以自行证明,提示一下:系数行列式不等于零);

  • 最后,将这个n个方程划分给n个参与者。需要计算的时候,只需要将k个方程获取进行联合计算就可以计算出a也就是秘密D。

4.2.3 案例介绍

下面通过一个案例,介绍下基于多项式的阈值秘密分享。

  • 输入
    • 秘密数字:D = 88
    • 参与方:10个, D 1 , D 2 , . . . , D 1 0 D_1, D_2, ...,D_10 D1,D2,...D10
    • 大素数:991
    • 解密阈值:3
  • 加密逻辑
    • 首先,生成方程组

      D 1 = q ( 1 ) = 88 + a 1 + a 2 D_1 = q(1) = 88 + a_1 + a_2 D1=q(1)=88+a1+a2,其中 a 0 = D a_0 = D a0=D

      D 2 = q ( 2 ) = 88 + 2 a 1 + 4 a 2 D_2 = q(2) = 88 + 2a_1 + 4a_2 D2=q(2)=88+2a1+4a2,其中 a 0 = D a_0 = D a0=D

      D 10 = q ( 10 ) = 88 + 10 a 1 + 100 a 2 D_{10} = q(10) = 88 + 10a_1 + 100a_2 D10=q(10)=88+10a1+100a2,其中 a 0 = D a_0 = D a0=D

    • 然后,基于素数生成 a 1 − − a k − 1 a_1 -- a_{k-1} a1ak1的值,设定 a 1 = 1 , a 2 = 2 a_1 = 1, a_2 = 2 a1=1,a2=2,则方程组如下,并且

      D 1 = q ( 1 ) = D + a 1 + a 2 = 91 D_1 = q(1) = D + a_1 + a_2 = 91 D1=q(1)=D+a1+a2=91,其中 a 0 = D a_0 = D a0=D

      D 2 = q ( 2 ) = D + 2 a 1 + 4 a 2 = 98 D_2 = q(2) = D + 2a_1 + 4a_2 = 98 D2=q(2)=D+2a1+4a2=98,其中 a 0 = D a_0 = D a0=D$;

      D 10 = q ( 10 ) = D + 10 a 1 + 100 a 2 = 298 D_{10} = q(10) = D + 10a_1 + 100a_2 = 298 D10=q(10)=D+10a1+100a2=298,其中 a 0 = D a_0 = D a0=D

    • 然后,可见 D 1 , D 2 , . . . , D 1 0 D_1,D_2, ..., D_10 D1D2,...,D10都小于我们设置的素数991,符合预设,所以将这10个方程分布分发到10个参与者分片Server。

  • 解密逻辑
    • 首先,假设抽取参与者1,2, 10的方程组成方程组进行解密,则方程组如下:

      D 1 = q ( 1 ) = D + a 1 + a 2 = 91 D_1 = q(1) = D + a_1 + a_2 = 91 D1=q(1)=D+a1+a2=91

      D 2 = q ( 2 ) = D + 2 a 1 + 4 a 2 = 98 D_2 = q(2) = D + 2a_1 + 4a_2 = 98 D2=q(2)=D+2a1+4a2=98

      D 10 = q ( 10 ) = D + 10 a 1 + 100 a 2 = 298 D_{10} = q(10) = D + 10a_1 + 100a_2 = 298 D10=q(10)=D+10a1+100a2=298

    • 最后,求解这个方程组,则 D = 88 , a 1 = 1 , a 2 = 2 D=88, a_1 = 1, a_2 = 2 D=88,a1=1,a2=2,则解出秘密D。

6 参考资料

  • STR: Secure Computation on Additive Shares Using the Share-Transform-Reveal Strategy https://arxiv.org/pdf/2009.13153.pdf
  • Multiparty Computation with Faulty Majority* https://link.springer.com/content/pdf/10.1007/0-387-34805-0_51.pdf
  • Shamir, Adi. “How to share a secret.” Communications of the ACM 22.11 (1979): 612-613.

7 番外篇

个人介绍:杜宝坤,隐私计算行业从业者,从0到1带领团队构建了京东的联邦学习解决方案9N-FL,同时主导了联邦学习框架与联邦开门红业务。
框架层面:实现了电商营销领域支持超大规模的工业化联邦学习解决方案,支持超大规模样本PSI隐私对齐、安全的树模型与神经网络模型等众多模型支持。
业务层面:实现了业务侧的开门红业务落地,开创了新的业务增长点,产生了显著的业务经济效益。
个人比较喜欢学习新东西,乐于钻研技术。基于从全链路思考与决策技术规划的考量,研究的领域比较多,从工程架构、大数据到机器学习算法与算法框架均有涉及。欢迎喜欢技术的同学和我交流,邮箱:baokun06@163.com

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值