首页 > 其他 > 详细

安全计算FRESCO介绍

时间:2020-07-09 17:17:57      阅读:108      评论:0      收藏:0      [点我收藏+]

?????FRESCO是一个用于高效和安全计算的框架。FRESCO是用Java编写的,并且满足MIT开源许可。这个项目的目的是在安全计算的基础上简化原型应用的开发。

?????这一篇是对这个项目的简要介绍。如果有任何问题可以使用我们在github的issue tracker进行询问,或者发送邮件到fresco@alexandra.dk。

?????FRESC的源代码在github地址: https://github.com/aicis/fresco。

全部内容主要包括下面:

  • 简介
    • 什么是安全计算
    • FRESCO的主要功能
    • 联系方式
    • 相关项目
  • 安装
    • 源码编译
    • 使用最新的FRESCO版本
    • 在docker容器中使用FRESCO
  • 快速入门
    • 一个简单的例子
    • 解释
  • 配套组建
    • 虚拟布尔和算术协议套件
    • TinyTables协议套件
    • SPDZ协议套件
    • SPDZ2K协议套件
  • 贡献
    • 拉取请求
  • 针对开发者
    • 目录结构
    • 使用IDE进行开发
    • 代码风格
    • 测试
    • 编译文档

简介

?????FRESCO是一个高效安全计算的一个框架。这个项目的目的是在安全计算的基础上简化原型应用的开发。

什么是安全计算

?????安全计算(多方计算(MPC)或者加密计算)是一个新兴的密码学工具,他允许多方基于私有数据进行安全的合作。更重要的是,安全计算可共同计算来自多方的私有数据,但是却不透露底层的私有数据。

?????例如比较经典的百万富翁问题:两个百万富翁在街上遇到,他们想要知道两个人中谁更富有,但是,他们也不想让人知道他们到底有多少钱。可以使用安全计算通过比较他们的财产来解决这个问题,同时保证他们只能知道谁更有钱且没有其他数据透露。

一般来说任何的计算函数都可以使用安全计算来实现私有计算,下面给出一些在原型中使用FRESCO框架的例子:

  • 计算调查的统计数据,而无需透露各个调查的答案(实践中)
  • 在对公司的财务和能源绩效进行基准测试的同时将各个公司的绩效数据保密(在实践和大数据安全项目中)
  • 让银行对潜在客户进行信用评级,而无需透露客户的私人数据或者银行的私人信用评级功能(在大数据安全项目中)

关于安全计算更多的信息可以在Wikipedia查看

FRESCO的主要功能

?????FRESCO框架既是为了支持在新的应用中使用安全计算,也是为了在开发新的安全计算技术(FRESCO协议套件)作为这些应用程序的后端。在某种意义上说,FRESCO可以看作是一个基础组建的集线器,这个集线器是用来连接应用程序和协议套件。FRESCO框架重点关注以下主要功能:

  • 快速简单的应用程序开发:使用FRESCO你可以编写安全计算的应用程序,而不需要成为密码学专家。你只需要指定要“关闭”和要“打开”的数据。FRESCO提供了许多常用安全功能的标准库。这些类库可以轻松的相互组合,以便在使用应用程序中快速实现新的复杂功能。一旦编写了应用程序,你就可以使用不同类型的协议套件来运行他。这是很重要的,因为每一个套件都有自己的安全级别和性能,在你编写应用程序时你不知道需要哪种安全性。
  • 快速简单的协议套件开发:FRESCO提供了可重复使用的模式和组建集合,这些集合允许开发者使用最小的努力开发协议套件。一旦你开发了自己的协议套件,你可以立即获的许多现有应用程序(和测试)在你新的套件上运行的优势。
  • 开放灵活的设计:FRESCO支持多种方式实现自己的应用程序和协议组件。可以使用Java来编写应用程序,协议套件具有完全的自由度,可以控制诸如线程调度、网络等事物。甚至有可能使用JNI以C / C ++编写协议套件,并且仍然可以访问使用FRESCO编写的许多现有应用程序。
  • 支持大型高效的计算:FRESCO支持并行化和预处理之类的技术,这些技术可以扩展到大型计算。

联系方式

?????如果你有任何意见、问题或者想法,请随时发送邮件到fresco@alexandra.dk 或者使用我们在GitHub上的问题追踪与FRESCO开发团队联系。

相关项目

?????有关安全计算的其他项目,请参阅Awesome-MPC 列表。

安装

?????FRESCO可以在Linux、MacOS和Windows上运行。下面安装指南已经在Linux和MacOS上进行了测试。

源码编译

?????安装FRESCO的首选方法是从GitHub的源码进行编译。这样你可以获取FRESCO最新的功能。为此,请确保已安装git,Java 8和Maven。

在终端运行:

git clone https://github.com/aicis/fresco.git
cd fresco
mvn install

?????上面命令将下载PRESCO源代码和依赖项,编译所有PRESCO模块,并运行测试套件。在成功构建之后,Maven应该在系统上安装PRESCO模块,并且可以在每个相应模块的./target目录以及本地Maven存储库中找到一个JAR文件。注意在执行mvn install 的测试套件可能需要几分钟,要跳过测试,可以使用mvn install -DskipTests。
?????如果你的项目中使用Maven,你可以通过在POM中增加依赖来使用FRESCO模块,例如:

<dependency>
  <groupId>dk.alexandra.fresco</groupId>
  <artifactId>core</artifactId>
  <version>1.0.1-SNAPSHOT</version>
</dependency>

?????可以将版本号增加到当前版本。

?????为了在你的项目中使用协议套件,也可以添加相关的套件作为依赖。例如,如果要使用SPDZ协议套件,则在POM中增加:

<dependency>
  <groupId>dk.alexandra.fresco</groupId>
  <artifactId>spdz</artifactId>
  <version>1.0.1-SNAPSHOT</version>
</dependency>

使用最新的FRESCO版本

?????如果希望安装PRESCO的发行版本,可以从发行网站https://github.com/aicis/fresco/releases获取源代码,并按照上述说明运行mvn install。

?????或者你的项目中使用Maven,只需要将依赖项添加到项目的POM文件中,然后让Maven从中央仓库下载依赖。例如,要使用核心功能和SPDZ模块的发行版,在POM中添加依赖:

<dependency>
  <groupId>dk.alexandra.fresco</groupId>
  <artifactId>core</artifactId>
  <version>1.0.0</version>
</dependency>

<dependency>
  <groupId>dk.alexandra.fresco</groupId>
  <artifactId>spdz</artifactId>
  <version>1.0.0</version>
</dependency>

?????可能需要把版本调整为所需版本。

在docker容器中使用FRESCO

?????如果希望在docker中使用FRESCO,我们已经提供了一个Docker镜像以供使用:

docker run -it frescompc/fresco

?????如果想要自己构建Docker镜像,我们已经将Dockerfile包含在存储库的根目录中,要构建镜像,只需要克隆存储库并运行:

docker build -t fresco .

?????然后运行这个容器:

docker run -it fresco

快速入门

?????这部分简要的介绍如何开始使用FRESCO。如果你有其他问题,请使用我们的问题跟踪器或发送电子邮件至fresco@alexandra.dk与我们联系。

?????开始入门最好的方式是浏览与FRESCO仓库捆绑在一起的演示,地址:
https://github.com/aicis/fresco/tree/master/demos

?????当前演示包括:

  • 求和 - 计算单方输入的多个整数的总和
  • 距离 - 计算两方提供的两个点之间的距离(二维空间中)
  • 聚合 - 计算硬编码列表的聚合。该列由(key,value)组成。该演示汇总键匹配的所有值
  • AES - 使用另一方提供的密钥来计算一方提供的AES加密文本框
  • 私有集交集 - 计算两方私有集的交集

?????每一个demo都包含如何直接在命令行上构建和运行的说明。

?????这些demos应该可以让你了解FRESCO是如何实现安全计算的。要开始使用自己的应用程序,应该查看ComputationDirectory 接口的各种实现类,这些实现类包含了FRESCO中的各种通用功能,这些功能组合起来可以实现更加复杂的功能。特别考虑将Numeric和AdvancedNumeric用于算术,将Binary和AdvancedBinary用于基于布尔的安全计算。

一个简单的例子

?????在这个示例中,我们演示了如何在自己的应用程序中使用FRESCO框架,FRESCO是一个灵活的框架,可以在你的技术栈中灵活使用,首先需要的你的项目中增加FRESCO的依赖。

?????这个示例是基于上面Distance类别的DistanceDemo。但是,在下文中,基本上任何FRESCO应用程序都可以代替DistanceDemo。

DistanceDemo distDemo = new DistanceDemo(1, x, y);
Party me = new Party(1, "localhost", 8871);
DummyArithmeticProtocolSuite protocolSuite = new DummyArithmeticProtocolSuite();
SecureComputationEngine<DummyArithmeticResourcePool, ProtocolBuilderNumeric> sce =
    new SecureComputationEngineImpl<>(
        protocolSuite,
        new BatchedProtocolEvaluator<>(new BatchedStrategy<>(), protocolSuite));
BigInteger bigInteger = sce.runApplication(
    distDemo,
    new DummyArithmeticResourcePoolImpl(1, 1),
    new KryoNetNetwork(new NetworkConfigurationImpl(1, Collections.singletonMap(1,
        me))));
double dist = Math.sqrt(bigInteger.doubleValue());

?????在这里,我们次用现有的应用程序DistanceDemo,并使用一个虚拟协议套件作为一个单独的部分来运行他。这可以直接在你的测试中运行。

?????祝贺您运行第一个FRESCO应用程序。

?????如果你想要看到多方参与计算,可以将上面的例子修改成两方在同一个机器上运行。

DistanceDemo distDemo = new DistanceDemo(1, x, y);
Party partyOne = new Party(1, "localhost", 8871);
Party partyTwo = new Party(2, "localhost", 8872);
DummyArithmeticProtocolSuite protocolSuite = new DummyArithmeticProtocolSuite();
SecureComputationEngine<DummyArithmeticResourcePool, ProtocolBuilderNumeric> sce =
    new SecureComputationEngineImpl<>(
        protocolSuite,
        new BatchedProtocolEvaluator<>(new BatchedStrategy<>(), protocolSuite));
HashMap<Integer, Party> parties = new HashMap<>();
parties.put(1, partyOne);
parties.put(2, partyTwo);
BigInteger bigInteger = sce.runApplication(
    distDemo,
    new DummyArithmeticResourcePoolImpl(myId, 2),
    new KryoNetNetwork(new NetworkConfigurationImpl(myId, parties)));
double dist = Math.sqrt(bigInteger.doubleValue());

解释

?????让我们看一下上面示例的每个部分呢。

?????在DinstanceDemo示例中,FRESCO应用程序实现了Application接口。想要运行应用程序,首先必须创建一个SecureComputationEngine。这个是FRESCO的核心组件,他是执行安全计算的入口,他通过进入计算的目录,激活协议组件来执行计算。

?????使用ProtocolSuite 和 ProtocolEvaluator(分别定义应用程序的安全计算技术和策略) 来初始化SecureComputationEngine。在这个例子中我们使用DummyArithmeticProtocolSuite 和 BatchedProtocolEvaluator。

?????为了运行应用程序,我们也需要一个ResourcePool 和 Network。 ResourcePool 由开发人员控制,是协议套件所需资源的中央数据库。网络是参与安全计算多方的连接器。默认情况下,FRESCO使用基于KryoNet的网络作为供应商,但是你可以自己创建网络。

?????
当我们调用runApplication,SecureComputationEngine 将会执行应用程序并返回评估的结果-两点之间的距离。

?????注意我们应用程序是如何创建的。实现Application接口表示我们的DistanceDemo类是一个FRESCO应用。应用程序还必须声明其输出以及这是什么类型的应用程序,application接口如下:

public interface Application<OutputT, Builder extends ProtocolBuilder> extends Computation<OutputT, Builder>

?????输入类型可以是任何类型,在我们的例子中他是BigInteger。我们在这里使用的构建器类型是数字类型,因为DistanceDemo计算适用于数字协议套件。因为Application接口继续啦Computation接口,需要我们实现下面方法:

DRes<BigInteger> buildComputation(ProtocolBuilderNumeric producer)

?????这个方法是定义了我们FRESCO应用程序如何构建。DRes的返回类型表示输出的结果。

安全计算FRESCO介绍

原文:https://www.cnblogs.com/liufei-yes/p/13274450.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!