PICCO是一个安全多方计算的开源项目,主体语言是C语言,但是对C语言进行了扩展,定义了一些新的安全变量形式,如private(public) int<32>, smcinput(), smcout()等等。这个开源项目是基于门限秘密共享的,提供了一个编译器将用户编写的C代码转换为安全多方计算的代码。他支持多方计算。分了三个角色:数据输入方,数据接收方,计算方。
这是github的源代码:https://github.com/PICCO-Team/picco 大家可以自行下载,里面也包含了官方文档。这里也主要根据官方文档的一步步操作。
使用体验:不怎么样。一些论文综述对它的评价还可以,但是我用起来感觉不怎么样。主要原因还是依赖库过时。这个项目没有更新维护,但是他所需要的底层库文件却在更新,导致编译时会出现很多错误(编译不通过),所以如果有人想试用它一定安装当时版本的依赖库。
官方文档指出项目依赖的两大库:GMP和Openssl。但是还有其他一些小工具,如果你是新机的话(比如我,新开的ubuntu20版的虚拟机)。大体记得有flex、bison这两个印象深刻,其他可能还有,已经忘了。
特别提醒,现在openssl已经更新到3.0了,千万不要用最新版,我是下的1.0.2u版本。具体安装方法,就百度下吧。另外百度的安装可能会让你安装在home下,一定要安装在/usr/local下。
项目一共有两个文件夹:compile 和 compute
包含一个编译一个计算的源代码。
进入文件夹后首先要编译所有的源代码:
# 进入compiler文件夹
$ cd compiler
# 运行compiler.sh
$ ./compiler.sh
运行可能会报错:/bin文件夹找不到。这时你需要手动创建:
$ mkdir bin
编译成功后,在bin文件夹内会生成三个主要编译器(picco, picco-utility, picco-seed),利用他们可以运行整个程序。
接下来创建一个项目:
1. 我创建了项目文件夹test1,进入后,首先要创建一个配置文件smc_config:
#我用的是sublime text3 进行文本编辑,用vim都行。
$ subl smc_config
打开文件编辑内容:
这个配置文件格式固定,第一行指定比特数,你可以空着他会自动选择合适的比特数。第二行代表计算节点的数量,第三行代表门限值(门限秘密共享的阈值)第四五行分别代表数据输入方和数据接收方的数量(也可以是同一个人)。
2. 编辑你的C语言代码,它在compute/sample里提供很多样例,你可以选取里面的进行测试。
我创建了一个muladd.c的文件:
3. 创建一个配置文件utility_config用来做多方数据数据输入。这里只需要创建一个空文本即可,执行下面的命令后会自动写入数据。如果没有这个文件他会报错。
4. 转换你的C语言程序:
../picco muladd.c smc_config muladd_gen utility_config
注意执行picco的路径,原来编译后是在compiler/bin里的,这里我是把他拿到主文件夹里了。muladd.c是你要转换的程序,muladd_gen是转换后的C程序。
执行后就多了一个C语言程序,这时utility_config也有内容了。
5. 将隐私数据变成秘密值
首先要确定数据,数据是放在一文本文件里的。
这里我创建一个data.dat文件在里面定义了我的数据。
执行命令进行秘密分享:
../picco-utility -I 1 data.dat utility_config sharefile
这时会生成三个分享值,因为我设置的计算节点是三个。
6. 编译转换的C语言程序:
将转换后的程序移动到compute文件夹下:
$ mv muladd_gen.cpp ../compute
打开makefile文件,将每一个有test-code的地方改成你的C文件的名字:
保存退出。
编译你的c语言程序:
$ make muladd_gen
第一次编译内容会很多,之后就没有那么多了。
编译好之后会生成你的可执行文件
将这个文件移动到你的项目文件夹里:
$ mv muladd_gen ../test1
7. 为每一个计算节点生成RSA公私钥对,这是因为在计算节点进行数据传输时,都是用rsa进行了加密传输。
#使用openssl生成私钥
$ openssl genrsa -out sk1.pem 1024
#使用sk1生成对应公钥
$ openssl rsa -in sk1.pem -pubout -out pk1.pem
有几个计算节点就要生成几对,我这里生成三对
8. 创建计算节点的配置文件runtime_config,内容如下:
1,127.0.0.1,9647,pk1.pem
2,127.0.0.1,9646,pk2.pem
3,127.0.0.1,9645,pk3.pem
格式是固定的,第一个代表计算节点的编号,后面是ip地址以及端口号,在后面是分配的RSA公钥
9. 运行计算节点:
打开三个终端,切换到项目文件夹。分别运行如下命令三次开启节点:
./muladd_gen 3 runtime_config sk3.pem 1 1 sharefile3 output
第一个“3”是计算节点的ID,sk3.pem是它的私钥;1代表输入方的数量,如果输入方数量是m,后面要输入m个对应的秘密分享文件(sharefile);后一个1代表接收方的数量,如果接收方数量是n,后面要输入n个对应的输出文件(output)。注意顺序,先运行节点3,再2再1。
10. 计算结果:
../picco-seed runtime_config utility_config
到这里只是计算节点结算的结果的分享值,还要进一步重构出最终结果。
11. 计算最终结果:
../picco-utility -O 1 sharefile utility_config result
最终结果储存在result中。