隐私计算:使用混淆电路开源框架Obliv-C解决百万富翁难题

cf09166aeab7044a40b17562dc8ce836.gif

“假设有两个百万富翁,他们都想知道谁更富有,但他们都想保护好自己的隐私,谁都不愿意让对方或者任何第三方知道自己真正拥有多少财富。那么如何在保护好双方隐私的情况下,计算出谁更有钱呢?”

这是2000年图灵奖得主姚期智院士在1982年提出的“百万富翁”问题。这个烧脑的问题涉及这样一个矛盾,如果想比较两人谁更富有,两人似乎就必须公布自己的真实财产数据。但是两个人又都希望保护自己的隐私,不愿让对方或者任何一个第三方知道自己的财富究竟有多少,那么在普通人看来,这几乎是一个无解的悖论。

然而在专业学者眼里,这是一个专业的加密学问题,可以表述为“一组互不信任的参与方之间,在需要保护隐私信息以及没有可信第三方的前提下进行协同计算的问题”。这也被称为“多方安全计算”(Secure Multiparty Computation,简称MPC或SMC)问题。姚期智院士在提出“多方安全计算”概念的同时,也提出了自己的解决方案混淆电路(Garbled Circuit)。

接下来本文就来介绍一下如何使用混淆电路开源框架Obliv-C解决百万富翁难题。

1. 开发框架Obliv-C

Obliv-C是美国弗吉尼亚大学(University of Virginia)安全研究小组(SECURITY RESEARCH GROUP)的研究项目。它是一款GCC包装器,该框架作者在C语言的基础上对其进行了一定的类C语言处理,添加了一些规则限制来实现混淆电路。Obliv-C支持两方的半诚实敌手方安全模型,源码采用商业友好的BSD许可证公开在GitHub中(https://github.com/samee/obliv-c),读者可从GitHub下载Obliv-C使用。该框架简单实用,下面对该框架进行介绍和使用。

  • 通过docker构建环境

为了方便读者快速试用,这里列出用于构建Obliv-C的docker镜像的代码供读者参考,如代码清单1所示。

代码清单 1 用于构建Obliv-C运行环境的docker镜像的代码

FROM ubuntu:20.04
WORKDIR /root
RUN apt-get update && apt-get install -y \
  ocaml \
  libgcrypt20-dev \
  libgmp-dev \
  ocaml-findlib \
  opam \
  m4 \
  git \
  vim \
  gcc \
  make
RUN git clone https://github.com/samee/obliv-c
#如果访问github速度慢,可以使用这个加速地址:


#RUN git clone https://github.com.cnpmjs.org/samee/obliv-c


WORKDIR /root/obliv-c


RUN opam init -a --disable-sandboxing && \


  opam switch create 4.06.0 && \


  opam switch 4.06.0 && \


  eval `opam config env` && \


  opam install -y camlp4 ocamlfind batteries bignum ocamlbuild && \


  ./configure && make


#可以将宿主机中的代码mount到容器的projects目录,使用容器进行编译和运行


VOLUME ["/root/projects"]


WORKDIR /root/projects


#为了后续测试方便特此安装了一些网络工具


RUN apt-get update && \


    apt-get install -y iputils-ping && \


    apt-get install -y telnet && \


    apt-get install -y net-tools && \


    apt-get install -y tcpdump

其实即使不使用docker,直接在Ubuntu系统中安装也非常简单,只需安装相应的依赖并下载源代码编译即可。Obliv-C在GitHub上的开源项目有相关安装说明,读者也可以根据代码清单 1推断出安装步骤,这里不再赘述。

注意:GitHub是境外的网站,在境内访问时经常出现网络连接问题。在构建docker镜像时如果访问github速度慢或者网络连接不稳定,可以使用https://github.com.cnpmjs.org这个代理地址。读者如果有能稳定连接GitHub的网络,还是建议使用GitHub官网地址。

然后使用如下命令编译docker镜像:

docker build -t obliv-c .

接下来介绍一下Obliv-C的编程语法和相关规则。

  • obliv修饰隐私输入数据

任何依赖于隐私输入的(指只有数据拥有方才知道其具体值,不对其他参与方公开的。下面统一以“隐私输入数据”代指此类数据)变量都应该使用obliv修饰符来声明。比如下面声明的函数中变量a依赖于隐私输入数据,而变量b是各方都知晓的公开数据,其返回结果也依赖于隐私输入数据,需要使用obliv来修饰:

obliv bool compare (obliv int a, int b) {
return a < b;
}

使用obliv修饰符修饰的相关规则:

规则1:只有C语言中的基础类型可以使用obliv进行修饰,比如int、char、float等。注意struct和指针也是不被支持的,但是struct中包含obliv字段或者指针指向obliv变量是可以支持的。另外函数也是可以用obliv修饰符修饰的,这部分会在下面进一步说明。

规则2:任何由obliv变量和非obliv变量组合而成的表达式最终也被视为obliv变量。

规则3:非obliv变量可以隐式地转换成obliv变量,但反过来只能是在各方同意调用 revealObliv 系列函数才可以,比如代码清单2所示。

代码清单 2 revealOblivInt使用示例

int a = 50, b;
obliv int c;
c = a; // 可以,非obliv变量a可以隐式地转换成obliv变量b
b = c; // 不可以, obliv变量c不可以直接转换成非obliv变量
revealOblivInt (&b, c, 0); //ok,使用revealObliv函数公开

使用revealObliv函数后,变量b就是一个普通的整型数,其值与变量c相同。上面代码中revealOblivInt中的第三个参数用来指定接收公开后变量的接收方,如果传入0则表示调用各方都会收到变量c的拷贝值并赋值到变量b。如果传入1,那么只有1号参与方才能收到变量c的拷贝值,而其他参与方只能收到一个默认值0。而这里的参与方编号则是各参与方通过调用setCurrentParty函数进行设定的,比如代码清单3根据程序运行时传入的命令行参数的不同将两个参与方分别设为1号和2号。

代码清单 3 setCurrentParty使用示例

ProtocolDesc pd;
const char* remote_host = (strcmp(argv[2], "--")==
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值