![4a51eade3be86834797c9d101f121457.png](https://i-blog.csdnimg.cn/blog_migrate/04237150a86953d11d0db5fb61323389.png)
参考链接:
- Projects · Security Engineering / CBMC-GC-2
- encryptogroup/ABY
前言
CBMC-GC是一个能将符合ANSI-C标准的程序转换成布尔电路的电路编译器,它还包括一个以其他格式输出电路的工具circuit-utils,这个工具对于仅支持部分电路格式的文件框架至关重要,比如EMP-toolkit。
一、ABY框架的搭建:
- 首先在Ubuntu系统中完成依赖项的安装和运行环境的配置(使用命令sudo apt-get install),包括g++ (version >= 8)、make、cmake、libgmp-dev 、libssl-dev、libboost-all-dev (version >= 1.66)。这里需要注意的是g++安装完成后一定要删除旧版本的软链接:sudo rm g++,然后创建新的软链接指向g++-8. 这个过程可以执行ls /usr/bin/g++*命令查看有没有删除成功。结果如下:
![e614e3134af2e4a5ee764ae085e4e0f2.png](https://i-blog.csdnimg.cn/blog_migrate/908fad71ff244e4b0242e6ab1d4e9050.png)
2. 框架搭建的问题可以参考已有文章
02 ABY框架的搭建及踩到的坑blog.csdn.net![2fd7609c10f5d33c1f392d7b77219895.png](https://i-blog.csdnimg.cn/blog_migrate/17888d94e99554ec4c9e528c1b19bf23.png)
在测试的时候要根据build文件夹里二进制文件的实际名称测试,以百万富翁问题为例,执行命令./millionaire_prob_test -r 0
和 ./millionaire_prob_test -r 1
后得到以下运行结果:
![22f91d4d4ce68f428f44f2dd81fc6e5c.png](https://i-blog.csdnimg.cn/blog_migrate/6461f922fe2322bb675831a7d9e6792f.jpeg)
测试通过,说明ABY框架已经搭建成功。
二、CBMC-GC的编译和运行
- 下载minisat包并编译:
make minisat2-download
,提示错误
![9ff311edb6dee6cdb3704dd336a471af.png](https://i-blog.csdnimg.cn/blog_migrate/357952109039368b285c56f9b992fa46.jpeg)
此时需要在命令前加上sudo
![04a27d6f6712d70fdce1551ebb437272.png](https://i-blog.csdnimg.cn/blog_migrate/9f214fd3d5ea9acfd49159583b81fae7.jpeg)
然后sudo make进行编译,大概需要几分钟,得到
![7c3b4f79e99f75708e30567fedae51ce.png](https://i-blog.csdnimg.cn/blog_migrate/7bddfa350a121e1345c75a8969eb6dd4.jpeg)
到这里CBMC-GC就编译完成了。
下面我们运行试试。
以examples文件夹的欧几里德距离为例,在CBMC-GC/examples/euclidean_distance下执行make,我们看到它生成了一个output.gate.txt文件,这就是编译输出的初始电路文件。
![bc524a88517dd023bc8be6b730833c7f.png](https://i-blog.csdnimg.cn/blog_migrate/fb5b79363049c493926bb8296c078a1e.jpeg)
然后我们验证一下,看两个参与方的输入类型和值以及电路计算的输出
![15d61ca498fb9de1529a80932dce56c4.png](https://i-blog.csdnimg.cn/blog_migrate/c4a1db466c372c18e1fda057d3ae88e6.jpeg)
结果正确。
但是,这个编译器提供的转换功能我们无法使用,即circuit-utils. S&P 2019上的一篇综述《SoK: General Purpose Frameworks for Secure Multi-Party Computation》也说明了这个问题, 他们给出的MPC-SoK/frameworks也没有解决此问题。
我们的解决办法是对makefile进行改动,定义一个转换命令run-trans,如下图所示:
![8884c77bac4487a6ff55cd3ef1ee7a26.png](https://i-blog.csdnimg.cn/blog_migrate/dc31ac7f37f01aefe4667c80f3b91a53.jpeg)
然后执行make run-trans,此时终端显示
![365e5c3bb09243aff7060834883e9979.png](https://i-blog.csdnimg.cn/blog_migrate/ae37a990f698c3cfb581b8f4392341a3.jpeg)
表示转换完成,电路门数由81691变为87835个(计算功能不变)。
此时,目录CBMC-GC/examples/euclidean_distance下已经生成了一个标准的电路文件bristol_circuit.txt(此文件和初始电路文件功能是相同的,只是格式不同)
![f9a9d03e92fbdd7f210d453c13439d26.png](https://i-blog.csdnimg.cn/blog_migrate/1b96b23178d44de114f7950256fdba5d.jpeg)
这就是计算欧几里德距离的标准电路文件。
对于其他具体问题,我们可以调用编译器将C程序转换为布尔电路,然后执行后续操作,比如两方计算。
二、利用ABY对生成的电路garble
按以下步骤执行:
- 将搭建好的ABY框架放到CBMC-GC下的cbmc-gc/文件夹里;
- 将aby-cbmc-gc/复制到ABY/src/examples/;
- 在ABY的顶级目录里执行make进行编译;
- 验证ABY/bin/里是否已经包含名为aby-cbmc-gc.exe的可执行文件;
这里遇到的问题是在第三步没有makefile,因此编译时显示未找到命令,解决办法是:
在CBMC-GC/ABY目录下执行 cmake . 命令,生成makefile后再编译,就可以了。
![aa4b8f6b46b2a7443a539086887a4b60.png](https://i-blog.csdnimg.cn/blog_migrate/b29c75b78cae012458e52b1456e2c708.jpeg)
此时我们去查看ABY/bin/是否已经包含aby-cbmc-gc.exe的可执行文件,然而并没有~怎么办呢T T
![93536c42e9f75b567fe62a4435708c7e.png](https://i-blog.csdnimg.cn/blog_migrate/f8341cc5ec68cae52ac6f0b91974ced6.png)
注意到原链接里说了这么一句话 API已经过时,所以我推测需要从某些地方做下改动,这一部分未完待续~~
![b5988330342297992f81f557ce8e3e2c.png](https://i-blog.csdnimg.cn/blog_migrate/ac17839259603d6a8069ca97db497cc7.png)
以上内容如果有错误欢迎指正!
写在最后:因为现在已经可以生成标准的电路文件,目前的问题是如何对其执行两方计算,比如garble。想到一种方法是利用ABY,一种方法是借助emp库的garble算法(至于为什么不直接利用emp-tool生成电路,是因为好难懂,遇到了很多问题。。弱鸡哭泣)目前只实现了后一种。。