上一篇文章介绍了混淆电路(Garbled Circuit),参与双方通过传输加密电路实现安全计算。理论上各种计算都可以用这种方法实现。对于各种纯粹由位运算(就是AND、OR、XOR这些)组成的算法(如比较操作或AES加密),GC效率是比较高的。但有一个问题是,即便一些常见的算术操作(如乘法、乘方等),电路也非常复杂,这意味着很多常见算法GC应付起来都很吃力。比如下面是两位整数的乘法电路,我们平时用的都是32位甚至64位乘法,还包括浮点运算等,直接用GC解决,效率是不敢恭维的。而现实生活中很多常用的算法,如目前比较火的机器学习深度学习算法包含了大量的浮点数/定点数乘法、除法、指数运算等等,纯靠GC是不能指望的。而本文介绍的密钥分享(secret sharing)则正好对算术操作比较拿手。

密钥分享的基本思路是将每个数字  拆散成多个数  ,并将这些数分发到多个参与方  那里。然后每个参与方拿到的都是原始数据的一部分,一个或少数几个参与方无法还原出原始数据,只有大家把各自的数据凑在一起时才能还原真实数据。计算时,各参与方直接用它自己本地的数据进行计算,并且在适当的时候交换一些数据(交换的数据本身看起来也是随机的,不包含关于原始数据的信息),计算结束后的结果仍以secret sharing的方式分散在各参与方那里,并在最终需要得到结果的时候将某些数据合起来。这样的话,密钥分享便保证了计算过程中各个参与方看到的都是一些随机数,但最后仍然算出了想要的结果。

那密钥分享具体是怎么运作的呢?我们先从一个最简单的方法讲起。假设A这个人有一个秘密数字  ,他想将其分发到那里。那么A首先要做的便是生成  个随机数  ,然后计算第  个数  ,最后A令  ,并将它们发给。上面这种简单的方法具有如下几条性质:

1. 各个数字  都是随机分布的,单独一个或若干个并不泄露任何信息;

2. 当所有合在一起时,可以还原  ,因为  ;

3. 这种方案具有加法同态的性质,也就是说,各参与方可以在不交换任何数据的情况下直接计算对秘密数据求和。什么意思呢?假设还有另一个人B,他也有一个秘密数字  ,并且和A一起将数据分发给了

为了做加法,  计算  , 计算  , …,  计算  ,

每个参与方都只对本地的随机数进行操作,不交换数据。而且根据secret sharing的性质,我们其实可以看到:  。也就是说,我们得到的是  的密钥分享,而这个求和的结果可以不暴露出来,继续用来做其他事情。

上面是一个简单的密钥分享的方法,满足了加法同态,且保证了只有n个参与方全部联合才能把数据解开。但有时候我们并不希望必须凑齐n个人才能解开,一方面是因为数据是分散在多个人手里的,要是有一个人不小心掉线了甚至是故意使坏,那数据就无法恢复了,另一方面很多时候我们不需要这么强的安全性,比如我们可以相信10个人里面至少一半是好人,而好人是不会偷偷把数据解开的,那么我们只需要保证4个或更少的人无法将数据解开就行了,而只有凑齐了5个或更多的人才能将数据解开。这种密钥分享叫做阈值密钥分享(threshold secret sharing)。

更具体地说,我们可以定义一种名为  阈值密钥分享的方案,此类方案允许任意 

个参与方将秘密数据解开,但任何不多于  个参与方的小团体都无法将秘密数据解开。前面提到的那种简单方案其实是  时的特殊情况。Shamir大神在1979年就提出了阈值密钥分享方案,且该方案支持任意的  。该方案运作方式如下:假设A想要使用  阈值密钥分享技术将某秘密数字  分享给,那么他首先生成一个  次多项式多项式  ,其中  就等于要分享的秘密数字  ,而  ,则是A生成的随机数。随后A只需将 分别发给即可。到了这一步,稍微有点线性代数基础的同学应该很容易看出来,  中任意  个凑在一起都可以解出,而任意  个凑在一起都无法得到 (即  )的确切解。通过这一点便达到了  阈值的要求。Shamir密钥分享方法也是满足加法同态的(因为多项式本身满足这一性质),有兴趣的同学可以自己验证一下。

说到这里,大家可以看到我们可以很容易地使用密钥分享技术在参与方不交换任何信息的情况下完成保护隐私的加法操作,但本文一开始提到的更重要的乘法操作呢?在完全不交换信息的情况下,要完成乘法是很难实现的,但如果在计算前或计算过程中适当交换信息,要完成乘法操作却有不少解决方案。

我们先考虑最简单的一种情况:一个秘密数字  和一个公开数字  相乘,目标是得到一个数字  的密钥分享,其中满足  。这个做起来其实挺简单的。假设我们使用最开始说的那种简单的密钥分享方法,即,那么我们的目标就是让分别得到  ,且满足  。要达成此目标,只需让  计算  , 计算  ,...,  计算  ,这个应该很容易理解。好吧这里仍然不需要参与方交换信息。

但如果  不是公开数字呢?也就是说只拥有  ,而不知道  的确切值。这时候上面说的方法就不管用了。在不交换信息的情况下,只能分别算出  ,但无法计算交叉项。欲求交叉项,必有信息交换,不过这个信息的交换,既可以发生在计算前,也可以发生在计算过程中,或者两个阶段都有信息交换。下面介绍一下如何使用预计算生成乘积元组的方法解决乘法问题。

我们假设有某种神奇的方法(具体怎么做就不展开了),使得能在计算发生前预先得到两个随机数  和  的秘密分享,以及  和  的乘积  的秘密分享,而且它们都不知道 和  和  的真实值,如下图所示:

现在有A和B分别分享了两个数字  和  ,参与方需要算出  和  的乘积  的密钥分享。这时候可以借助前面生成的随机乘积元组。我们先令  以及  ,然后我们可以看到

参与方可以联合起来将  和  的值解开,由于  和  都是值未知的随机数,因此  和  的值并不会暴露关于  和  的信息。上面那个式子中,  可以直接用公开的 和  算出来,  以及  的密钥分享则可以用前面的秘密数与公开数的乘法得到,而  的密钥分享则是一开始就存在,因此这几项合起来便能得到  的密钥分享。

需要注意的是,每个这样的秘密数字的乘法都会消耗一组随机乘积元组,不过由于随机乘积元组的值和计算时的  和  的值是无关的,因此这样的元组可以由参与方在空闲的时候预先生成一大堆,等需要用上的时候再拿出来消耗掉。

在密钥分享中,由于每次计算后得到的仍然是密钥分享,因此各操作可以串起来,直到算到最终结果,再将其暴露出来。有了加法和乘法,我们理论上可以进行各种计算,比如除法和指数都可以用加法和乘法去拟合,浮点数运算也可以模拟,具体就不展开了。

[1] Shamir, Adi. "How to share a secret." Communications of the ACM 22.11 (1979): 612-613.

[2] Beaver, Donald, and Shaft Goldwasser. "Multiparty computation with faulty majority." Conference on the Theory and Application of Cryptology. Springer, New York, NY, 1989.

密钥分享Secret Sharing介绍相关推荐

  1. 【密码学】【多方安全计算】Secret Sharing秘密共享浅析

    Secret Sharing秘密共享浅析 什么是秘密共享 加解密过程 验证加解密 参考文献 秘密共享(Secret Sharing)是实现多方安全计算的一种常用方式,MPC当然也可以用混淆电路(Gar ...

  2. 秘密分享(Secret Sharing)

    秘密共享(Secret Sharing,SS)是1979年由Shamir和Blakey提出的,并在此之后40多年秘密共享被广泛认识和深入的研究. 秘密共享著名的(t,n)阈值方案如图所示:设秘密s被分 ...

  3. 私钥分割 — Shamir Secret Sharing

    在做区块链应用的时候,最常碰到的一个问题就是,怎么保管私钥,怎么让使用者方便,但又同时是安全的.第一个想法就是备份密钥(不论是passphrase/keystore/私钥),但是如果把使用者密钥(加密 ...

  4. Shamir密钥分享算法 python实现

    Shamir's Secret Sharing:维基百科参考 Shamir密钥分享的算法大致内容是:把一个真实值拆分成好多份,每一份都不同且不是真实值,而只有明确知道了固定份数的内容,才能破解秘钥.详 ...

  5. CCC3.0学习笔记_数字密钥分享

    系列文章目录 第六章 CCC3.0 DIGITAL KEY SHARING 数字密钥分享 文章目录 系列文章目录 前言 一.跨平台密钥分享通道建立 1. Channel Establishment f ...

  6. verifiable secret sharing可验证的秘密共享

    1. secret sharing秘密共享 1.1 secret sharing definition 在Adi Shamir 1979年论文<How to share a secret> ...

  7. Verifiable Secret Sharing

    参考文献: Feldman P. A practical scheme for non-interactive verifiable secret sharing[C]//28th Annual Sy ...

  8. V神提出新型密钥分享方案,可用于脑钱包和社交恢复设计应用

    注:原文作者是以太坊联合创始人Vitalik Buterin,在这篇文章中,他描述了一种新型的M-of-N密钥分享方案,并提出了脑钱包和社交恢复设计的两种应用案例. 假设你希望生成一个秘密 s,而s可 ...

  9. SECRET SHARING STEP BY STEP

    In this blog article I will show the different types of secret sharing methods especially the common ...

最新文章

  1. WebView 实现JS效果和a标签的点击事件
  2. Kafka学习之路 (三)Kafka的高可用
  3. Zookeeper在Kafka中的作用
  4. html5该怎么样学习?零基础入门HTML5学习路线
  5. js数字最多保留两位小数_8085微处理器中最多两个8位数字
  6. 一笔没有问题的数据 误操作成汇总和结算不一致的情况的处理方式
  7. phpcms v9 数据源
  8. IOS 学习笔记 2015-03-27 我理解的OC-代理模式
  9. STM32编码器的学习笔记
  10. 凯歌Java百家号_centos7下静默安装oracle11G图解配置 1
  11. 用批处理读取特定注册表项的路径值
  12. ipad 计算机连接网络设置方法,iPad Air怎么设置上网?苹果平板常用的上网方法图解...
  13. 訪问可能没有定义的data (通过static类型flash.net:FileReference引用)
  14. VBA版本获取ClientKey
  15. 小麦苗的常用代码--常用命令(仅限自己使用)--上
  16. 联想服务器怎么装系统和配置,联想服务器的配置及操作系统的安装.pdf
  17. JAVA中dot的用法_doT学习(一)之语法
  18. https:浏览器如何验证数字证书
  19. springboot+vue在线答疑系统(源码+说明文档)
  20. [CF1463F]Max Correct Set

热门文章

  1. Android自定义View之年度账单曲线图
  2. python快递费用计算公式_python2.4项目:快递计价程序
  3. 数据库字段的自动填充
  4. Utools效率工具集
  5. agilent仪表频谱仪控制程序
  6. 最大公约数最小公倍数探讨
  7. Visual C++从入门到精通(第3版)光盘
  8. xampp修改mysql密码_XAMPP环境下mysql的root用户密码修改方法_MySQL
  9. java OOP面向对象编程—2
  10. element tree不刷新视图_BIM小技巧001 | Revit如何在平面视图中看见新增的标高?