格密码开源库PALISADE
PALISADE是新泽西理工学院的一个格密码开源项目,也是现在少有的成熟稳定的格密码开源库,这篇文章主要介绍该库的使用与构建。
事实上该库的ReadMe文档介绍的十分详细,但是如果不熟悉C++开源项目的构建和make命令,可能自己使用的时候会非常折磨,因为网上关于这方面的知识少之又少。
根据文档构建项目
文档中介绍了PALISADE在Ubuntu、CentOS、Windows中的构建。很不幸,在三个系统中我都构建了一遍,三个系统都构建成功,但开发过程并不顺利,不然谁又想要被折磨三遍呢…
主要构建过程根据项目文档来做大体相似;
首先clone该项目
git clone https://gitlab.com/palisade/palisade-release.git
下载项目的第三方依赖
git submodule sync --recursive
git submodule update --init --recursive
这一步可能会出现问题,首先是centos可能会无法识别这个命令,即便在ubuntu或者Windows中识别成功,也会显示
翻译过来就是===>
子依赖项目注册成功
开始clone.....
然后开始漫长地等待…
后面我发现这样下载是肯定没法成功的,这两句命令就是下载依赖的第三方库,在项目主页中可以看到有一个third-party
文件夹,里面有四个文件夹长的不太一样,点其中一个可以发现会跳转到一个GitHub开源库,所以该文件夹就是一个第三方依赖的链接,我们要做的就是把四个依赖下载下来;作者在ReadMe也说了:
PALISADE downloads submodules for cereal, google-benchmark, google-test, and gperftools open-source libraries
所以干脆开四个终端,把四个依赖项目一个一个git clone 下来;
注意!下载下来的文件夹名字是GitHub上的项目名,要按照作者设定的文件夹名字放,不然待会儿make的时候会找不到文件;
我的习惯是把四个空文件夹删掉,然后下载四个项目,再把两个google的开源库文件夹重命名
构建项目
当你直接在palisade中运行make,他会提醒你按照他的方式build,正如其MakeFile所言:
@echo "PALISADE has converted to CMake"
@echo "Try this:"
@echo mkdir build
@echo cd build
@echo cmake ..
@echo make
@echo make install \(to install in 'installed'\)
所以按照他要求命令运行就行了;
mkdir build
cd build
cmake ..
这里的cmake是把外层的CMakeLists.txt
构建到build
文件夹内,会下载和检查系统的依赖,这一步应该是为了保护项目的完整性,反正要是你环境不对或者自己瞎弄,顶多也就是build
文件夹内文件混乱,删了重来就行;
注意如果这里报错,他也是正常的打印内容,要注意去看她有没有说,类似要求GCC版本超过6.1
这样的话,如果有就代表下载失败,你需要按照他的要求更新环境再cmake
然后继续操作
make
这一步到33%左右大概率会报错,会提示你test/Main_TestAll.cpp
中的COLOR_GREEN
和COLOR_RED
无法识别,我不认识这两个是什么关键字,简单看了一下代码,出现这两个关键字的几行代码都是打印内容的,没有什么用处,所以我把代码里的这几行都注释掉再make就可以正常构建了;
这一步时间有点久。
make install
正式构建项目生成库文件
Linux路径就是默认的/usr/local/include
和/usr/local/lib
,Windows的在C:\Program Files (x86)\PALISADE
里,Windows的路径我也找了好久,而且这路径带空格带全角括号,之后使用的时候非常非常难受…
至此,项目构建完毕
构建测试用例
make testall
bin/examples/pke/simple-integers
印象中没什么坑,这两步是把几个库的examples的cpp文件构建了一遍,bin/examples
里全是可执行程序,跑一下结果正常就行了;
Tip
Windows
如作者所言,Windows中需要安装MSYS2【http://www.msys2.org/】去构建项目;
这个网站要翻墙,本来做一个免费的CSDN下载链接的,但他说资源已存在上传不了,那就算了;
这个软件需要先把依赖和MinGW啥的都下好,然后就可以直接用make命令打包编译了;
其实这个命令行里cd /;再ls可以看到是一个模拟的Linux系统,就在你自己的安装目录,他模拟了一个Linux文件系统,所以你要是不想上传这个项目,就直接把项目拖拽到Windows里的该目录里;
但是虽然打包生成了dll和头文件,可能也无法使用,我查了一晚上看源码搜bug,有一些问题我觉得很奇怪…
“__int128” , “DoubleNativeInt” , “__uint128_t” , “attribute” cannot be recognized
比如这个__int128在Windows中是无效的,但是宏定义中if条件为true,是会运行的,就很奇怪…
我虽然打包编译测试都成功了,但是在自己项目中运行是失败的,所以最终我放弃了Windows系统.
后面的之后填坑…
库文件的使用
lib更新过要sudo ldconfig使其生效
g++ -o main simple-integers.cpp -L. -lPALISADEpke -lPALISADEsignature -lPALISADEcore -lPALISADEbinfhe -lPALISADEabe
echo $LD_LIBRARY_PATH
vim ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH/usr/local/lib
生成库文件并使用
g++ palisadeuse.cpp -fPIC -shared -o libpause.so
复制libpause过去
编写头文件
#ifndef pause_H_
#define pause_H_
int test();
#endif /* MAX_H_ */
调用
g++ -o mainxy usedemo.cpp -L. -lpause -lPALISADEpke -lPALISADEsignature -lPALISADEcore -lPALISADEbinfhe -lPALISADEabe
然后就有mainxy了
琢磨了一下,可以换一种方式实现
直接用python调so太麻烦了,可以直接生成可执行文件,通过传参和输出的值实现效果;
第二种方法可以用:https://blog.csdn.net/u013066730/article/details/104838191?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control
关于这个subprocess这个库有很多函数可以用:https://www.cnblogs.com/zhou2019/p/10582716.html
subprocess.check_output()
亲测可以传参并拿到out值
vv.exe可以测试