?????FRESCO是一个用于高效和安全计算的框架。FRESCO是用Java编写的,并且满足MIT开源许可。这个项目的目的是在安全计算的基础上简化原型应用的开发。
?????这一篇是对这个项目的简要介绍。如果有任何问题可以使用我们在github的issue tracker进行询问,或者发送邮件到fresco@alexandra.dk。
?????FRESC的源代码在github地址: https://github.com/aicis/fresco。
全部内容主要包括下面:
?????FRESCO是一个高效安全计算的一个框架。这个项目的目的是在安全计算的基础上简化原型应用的开发。
?????安全计算(多方计算(MPC)或者加密计算)是一个新兴的密码学工具,他允许多方基于私有数据进行安全的合作。更重要的是,安全计算可共同计算来自多方的私有数据,但是却不透露底层的私有数据。
?????例如比较经典的百万富翁问题:两个百万富翁在街上遇到,他们想要知道两个人中谁更富有,但是,他们也不想让人知道他们到底有多少钱。可以使用安全计算通过比较他们的财产来解决这个问题,同时保证他们只能知道谁更有钱且没有其他数据透露。
一般来说任何的计算函数都可以使用安全计算来实现私有计算,下面给出一些在原型中使用FRESCO框架的例子:
关于安全计算更多的信息可以在Wikipedia查看
?????FRESCO框架既是为了支持在新的应用中使用安全计算,也是为了在开发新的安全计算技术(FRESCO协议套件)作为这些应用程序的后端。在某种意义上说,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>
?????如果希望安装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镜像以供使用:
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
?????当前演示包括:
?????每一个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的返回类型表示输出的结果。
原文:https://www.cnblogs.com/liufei-yes/p/13274450.html