MPC的数学描述:
有n个参与者P1,P2,…Pn,要以一种安全的方式共同计算一个函数,这里的安全是指输出结果的正确性和输入信息、输出信息的保密性。具体地讲,每个参与者P1,有一个自己的保密输入信息X1,n个参与者要共同计算一个函数f(X1,X2, … ,Xn)=(Y1,Y2, … ,Yn),计算结束时,每个参与者Pi只能了解Yi,不能了解其他方的任何信息

MPC的特点:
安全多方计算理论主要研究参与者间 “协同计算” 及 “隐私信息保护” 问题,其特点包括
1、输入隐私性
2、计算正确性
3、去中心化等

MPC的安全挑战模型:
包括半诚实敌手模型和恶意敌手模型。市场大部分场景满足半诚实敌手模型。
半诚实敌手模型:计算方存在获取其他计算方原始数据的需求,但仍按照计算协议执行。半诚实关系即参与方之间有一定的信任关系,适合机构之间的数据计算;
恶意敌手模型:参与方根本就不按照计算协议执行计算过程。参与方可采用任何(恶意)方式与对方通信,且没有任何信任关系。结果可能是协议执行不成功,双方得不到任何数据;或者协议执行成功,双方仅知道计算结果。更多适用于个人之间、或者个人与机构之间的数据计算。

MPC技术框架图:

当一个MPC计算任务发起时,枢纽节点传输网络及信令控制每个数据持有方可发起协同计算任务。
通过枢纽节点进行路由寻址,选择相似数据类型的其余数据持有方进行安全的协同计算。
参与协同计算的多个数据持有方的MPC节点根据计算逻辑,从本地数据库中查询所需数据,共同就MPC计算任务在数据流间进行协同计算。
在保证输入隐私性的前提下,各方得到正确的数据反馈,整个过程中本地数据没有泄露给其他任何参与方。

MPC与区块链的比较:

MPC与区块链技术的结合:
区块链技术发展至今,特别是对于共有链而言,面临着两大困扰:
一、是公开数据带来的隐私问题;
二、是链上无法进行高效计算处理的性能问题。

隐私问题不但包括区块链上记录的交易信息的隐私,还包括区块链上记录以及传递的其他数据的隐私,这一点在大数据时代尤为重要。
而高性能的计算一直都是区块链发展的一个瓶颈,在公有网络中,大量节点需要全部对计算任务进行处理,以保证计算任务处理结果的准确性和不可修改性。但这样做造成了严重的资源浪费和低效,同时,为了取得去中心化的效果,搭建节点的要求又不能太高,这一点又进一步影响了单个节点处理任务的能力。

这时候,安全多方计算的输入隐私性、计算正确性、去中心化等优点就可以很好地帮助解决这些问题。

基于区块链项目的MPC项目示例:
1.iCube——全球首个安全多方计算区块链金融项目
2.点融
3.Defi

MPC的关键技术

  1. 参与方个数区分,可分为两方计算(two party computation,简称 2PC)和多方计算(multi-party computation)。 2PC:核心是用了混淆电路(Garbled Circuit,简称GC)和不经意传输(Oblivious
    Transfer)这两种密码学技术; 一方将需要计算的逻辑转换为布尔电路,再将布尔电路中的每一个门进行加密;
    在完成该操作后,该参与方将加密电路以及与其输入相关的标签发送给另一参与方,而另一方无法从标签中反推输入的信息;
    另一方(作为接收方)通过不经意传输按照其输入选取标签,并在此基础上对加密电路进行解密获取计算结果。

  2. 计算场景区分,可分为特定场景和通用场景。 特定场景是指针对特定的计算逻辑,例如比较大小,确定双方交集等,具体场景可以采用多种不同的密码学技术设计协议。
    通用场景是指安全多方协议的设计要具有完备性,可以理论上支持任何计算场景,目前采用的方法主要是混淆电路,不经意传输以及同态加密。

MPC的应用范围:
不论是在全球范围内流动的资源、货物、资本、技术、人、数据或是观念,还是由于各种现实世界摩擦造成的冲突、监管和制约等等,都在影响着各方对于经济、文化、教育、医疗、公共管理等各行各业信息的判断和使用。
1.金融业
2.制造业
3.医疗业
4.电子政务

MPC的优势:
拓展了传统分布式计算以及信息安全范畴,为网络协作计算提供了一种新的计算模式,对解决网络环境下的信息安全具有重要价值。利用安全多方计算协议,一方面可以充分实现数据持有节点间互联合作,另一方面又可以保证秘密的安全性。

百万富翁问题:
两个富翁,分别为Alice和Bob。他们自己都清楚自己有几百万财产,也即,他们心里清楚 1~10中的一个数(代表自己百万级的财富);他们想知道到底谁的数更大一些。
这里假定:
· 两人都值得信任,不会作假
· 两人都希望诚实地比较出谁更服务(即谁的数更大)
· 两人又都希望知道对方财产到底是多少,如果可能的话,拿到具体数字最好了
· 其实这里假定的是一个安全多方计算的模型 - 半诚实对手模型,即计算方存在获取其他计算方原始数据的需求,但仍然按照计算协议执行。
(另外有恶意敌手模型,在这种模型中,参与方可以造假,即不按照计算协议执行计算过程。)

解决方案一:不经意传输
Alice找10个一模一样的箱子,按照1~10的顺序摆好,并按照自己的财富值分别往里面放入苹果梨和香蕉,具体放法为:如果序号小于自己的财富之,放入苹果,相等,则放入梨,大于自己的财富值,放入香蕉;把10个盒子都叫上锁;
并叫Bob过来(或者寄给Bob)Bob根据自己的财富值对相应的箱子再加一把锁。然后把其他所有箱子销毁。并把这个选择的箱子送给Alice。
Alice看到送回来的箱子,但他不知道Bob选择的是第几个箱子,因为每个箱子都是一样的。
Alice、Bob分别开锁,看里面是什么水果:
· 如果是苹果,Alice比Bob富有;
· 如果是梨,两人一样有钱
· 如果是香蕉,Bob比Alice富有
(此种解决方案前提是双方都是可信的,双方会遵守协议,所以这是一个半诚实对手模型。如果有一方造假,那么结果就不可信了。)

2PC半诚实模型:

1、先对输入数据做预处理。
  遵循原则:1、尽量少的数据输入;2、尽量多的数据预处理
——数据量太大时会大幅降低算法执行效率。
2、计算逻辑转化为布尔电路。
  遵循原则:尽量简单的计算逻辑
——由于MPC是计算密集型和通信密集型算法,若计算逻辑很复杂,会对执行效率产生很大影响。
转化方式:手动/电路编译器Frutta
3、将输入的布尔电路做GC和OT算法(详细在下面叙述),得到输出结果。

GC+OT的两方计算基本框架:

解决方案二:密码学

  1. 假设富翁王有i亿资产,李有j亿资产。 王选取一个公钥,使得李可以传递加密的信息。
  2. 首先,李选取一个随机的大整数x,把x用王的公钥加密,得到密文K。李发送k-j给王。
  3. 王收到密文c=K-j之后,对c+1,c+2,…,c+10进行解密,得到十个数字。再选取一个适当大小的素数p,把这十个数字除以p的余数记作d1,…,d10。注意:这十个数字看起来应该是完全随机的,关键是等式modp成立。
  4. 最后,王对这一串数字作如下操作:前面i个数不动,后面的数字每个加一,然后发回给李。
  5. 这样一通复杂的操作之后,李检查第 j个数字。如果等于x mod p 的话,说明这个数字没有被加一,所以 i >= j. 反之,则 i < j。

【注】公钥的生成参考RSA算法

【附】密码学算法解析

import math
import random# 百万富翁问题实现
# 自己生成公钥私钥并解密加密# 获取小于等于指定数的素数数组
def get_prime_arr(max):prime_array = []for i in range(2, max):if is_prime(i):prime_array.append(i)return prime_array# 判断是否为素数
def is_prime(num):if num == 1:raise Exception('1既不是素数也不是合数')for i in range(2, math.floor(math.sqrt(num)) + 1):if num % i == 0:# print("当前数%s为非素数,其有因子%s" % (str(num), str(i)))return Falsereturn True# 找出一个指定范围内与n互质的整数e
def find_pub_key(n, max_num):while True:# 这里是随机获取保证随机性e = random.randint(1, max_num)if gcd(e, n) == 1:breakreturn e# 求两个数的最大公约数
def gcd(a, b):if b == 0:return aelse:return gcd(b, a % b)# 根据e*d mod s = 1,找出d
def find_pri_key(e, s):for d in range(100000000):  # 随机太难找,就按顺序找到d,range里的数字随意x = (e * d) % sif x == 1:return d# 生成公钥和私钥
def build_key():prime_arr = get_prime_arr(100)p = random.choice(prime_arr)# 保证p和q不为同一个数while True:q = random.choice(prime_arr)if p != q:breakprint("随机生成两个素数p和q. p=", p, " q=", q)n = p * qs = (p - 1) * (q - 1)e = find_pub_key(s, 100)print("根据e和(p-1)*(q-1)互质得到: e=", e)d = find_pri_key(e, s)print("根据 e*d 模 (p-1)*(q-1) 等于 1 得到 d=", d)print("公钥:   n=", n, "  e=", e)print("私钥:   n=", n, "  d=", d)return n, e, d# 加密
def rsa_encrypt(content, ned):# 密文B = 明文A的e次方 模 n, ned为公钥# content就是明文A,ned【1】是e, ned【0】是nB = pow(content, ned[1]) % ned[0]return B# 解密
def rsa_decrypt(encrypt_result, ned):# 明文C = 密文B的d次方 模 n, ned为私钥匙# encrypt_result就是密文, ned【1】是d, ned【0】是nC = pow(encrypt_result, ned[1]) % ned[0]return Cif __name__ == '__main__':pbvk = build_key()pbk = (pbvk[0], pbvk[1])  # 公钥 (n,e)pvk = (pbvk[0], pbvk[2])  # 私钥 (n,d)# 生成两个亿万富翁i = random.randint(1, 10)j = random.randint(1, 10)print("==============================================")print("Alice有i = %s亿,Bob有j = %s亿" % (i, j))x = random.randint(50, pbk[0]-1)  # assert(x < N) | N=p*qprint("随机选取的大整数x: %s" % x)K = rsa_encrypt(x, pbk)print("大整数加密后得密文K: %s" % K)c = K - jprint("Alice收到数字c: %s" % c)c_list = []for k in range(1, 11):t = rsa_decrypt(c + k, pvk)c_list.append(t)print("对c+1到c+10进行解密: %s" % c_list)# 选取合适大小的p,这里根据感觉写了100以内的随机数,生成的序列的值也要求小于100# 这个p是该算法的精华,在实际中选取p的策略要考虑到安全性和性能的因素d_list = []p = random.randint(30, x)  # assert(p<x)for k in range(0, 10):d_list.append(c_list[k] % p)print("p的值为: %s" % p)print("除以p后的余数为: %s" % d_list)d_list[i-1] += 1for k in range(i, 10):d_list[k] += 2print("前i-1位数字不动,第i位数字+1,后面数字+2后: %s" % d_list)print("第j个数字为: %s" % d_list[j - 1])print("x mod p为: %s" % (x % p))if d_list[j - 1] == x % p:print("i>j,即Alice比Bob有钱。")if i - j >= 0:print("验证成功")else:print("代码存在错误")elif d_list[j - 1] == (x%p)+1:print("i=j,即Alice和Bob一样有钱。")else:print("i<j,即Bob比Alice有钱")if i - j < 0:print("验证成功")else:print("代码存在错误")

一文看懂MPC百万富翁问题的两种解法:CG+OT不经意传输解法或者RSA密码学解法相关推荐

  1. 揭秘阿里中台!一文看懂阿里推荐业务的两大利器

    从工程的角度看,搜索和推荐既有差异点,又有共同点.阿里巴巴集团的搜索和推荐系统由同一个部门研发,因此很多工程能力是复用的,如搜索和推荐业务的算分服务引擎都是RS/RTP. 本文介绍阿里巴巴推荐的中台产 ...

  2. ​【文末有福利】揭秘阿里中台!一文看懂阿里推荐业务的两项利器

    从工程的角度看,搜索和推荐既有差异点,又有共同点.阿里巴巴集团的搜索和推荐系统由同一个部门研发,因此很多工程能力是复用的,如搜索和推荐业务的算分服务引擎都是RS/RTP. 本文介绍阿里巴巴推荐的中台产 ...

  3. 揭秘阿里中台!一文看懂阿里推荐业务的两大利器 | 赠书

    点击▲关注 "中生代技术"   给公众号标星置顶 更多精彩技术内容 第一时间直达 从工程的角度看,搜索和推荐既有差异点,又有共同点.阿里巴巴集团的搜索和推荐系统由同一个部门研发,因 ...

  4. 揭秘阿里中台!一文看懂阿里推荐业务的两项利器 | 赠书

    从工程的角度看,搜索和推荐既有差异点,又有共同点.阿里巴巴集团的搜索和推荐系统由同一个部门研发,因此很多工程能力是复用的,如搜索和推荐业务的算分服务引擎都是RS/RTP. 本文介绍阿里巴巴推荐的中台产 ...

  5. 深度学习:一文看懂CNN、RNN等七种范例

    https://www.toutiao.com/a6670651004318384653/ 1. 前馈神经网络 (FFNNs) 前馈神经网络 (Feed Forward Neural Networks ...

  6. 一文看懂KMP(看毛片)算法

    一文看懂KMP算法 KMP是一种模式匹配算法.常用于在一个较长的字符串中查找一个较短的字符串.通常称较长的字符串为主串,较短的待匹配的字符串为模式串. 比如给定一个主串S = ababacd,一个模式 ...

  7. 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)

    2019-12-20 20:01:00 数据在人工智能技术里是非常重要的!本篇文章将详细给大家介绍3种数据集:训练集.验证集.测试集. 同时还会介绍如何更合理的讲数据划分为3种数据集.最后给大家介绍一 ...

  8. 一文看懂计算机视觉-CV(基本原理+2大挑战+8大任务+4个应用)

    2020-03-06 20:00:00 计算机视觉(Computer Vision)是人工智能领域的一个重要分支.它的目的是:看懂图片里的内容. 本文将介绍计算机视觉的基本概念.实现原理.8 个任务和 ...

  9. 一文看懂人脸识别(4个特点+4个实现步骤+5个难点+算法发展轨迹)

    2020-03-09 20:01:00 人脸识别是身份识别的一种方式,目的就是要判断图片和视频中人脸的身份时什么. 本文将详细介绍人脸识别的4个特点.4个步骤.5个难点及算法的发展轨迹. 什么是人脸识 ...

最新文章

  1. PAT(甲级)2019年秋季考试 7-3 Postfix Expression
  2. 男人必看:最近在网上流传甚广的一个帖子
  3. Openwrt按键检测分析-窥探Linux内核与用户空间通讯机制netlink使用
  4. .NET Core on K8S学习实践系列文章索引(持续更新)
  5. 软件体系架构课下作业07
  6. android 导航自动切换,Android导航抽屉切换图标向右
  7. Squeeze not supported yet!
  8. 2017年4月5号课堂笔记
  9. 关于git的cherry-pick命令
  10. 诺基亚N950–MeeGo式体验
  11. 快手短视频批量下载工具详细使用说明
  12. 深度学习图像识别笔记(二):红外图像
  13. 一文了解大厂的DDD领域驱动设计
  14. H5新增音频标签-audio
  15. 豆豆趣事[2014年04月]
  16. 使用js的方式设置点击按钮发送短信倒计时并且防止刷新
  17. 【设计原则】里氏代换原则
  18. SSM 之 MyBatis
  19. 区块链的崛起到底是大势所趋还是异军突起
  20. 联想天逸100-15ibd加装固态硬盘折腾记

热门文章

  1. Kali安装telnet
  2. Java中如何读取和写入zip文件
  3. 华为手机这几个默认设置,一定要关闭,再也不卡顿
  4. iphone与ipad固件区分方法
  5. LIZ 上班搞笑语录
  6. libcurl开源库封装ftp工具,支持多线程并发、断点续传、超时连接、传输速率控制
  7. 用AE实现一个文字光晕效果
  8. DB2基础语法与简单使用
  9. 关于DEVC++调试时将该读入的内容输入后终端自动闪退问题解决方案。
  10. Leetcode 853.车队