为了使用一个paillier库,我在一个个坑里断断续续摸爬滚打了两天,好在成功上岸。作为一个刚刚接触python不久的菜鸟,本篇不讨论如何修轮子造轮子的问题,仅仅作为芸芸众菜记录一下我遇到的环境上的问题,如何解决,原因是什么。这些不仅是我的记录,也希望它能帮助遇到同样问题的你节省时间。感谢StackOverflow和CSDN上同侪的指点,如果有你们觉得更好的解决方案,欢迎分享和讨论~
文中会涉及一些工具的文档,但由于年久失修等因素,按照文档一步步走就是在踩我踩过的坑。因此无论和这些官档玩得多么开心,请记得回来看一看或者至少看完再去。
Let’s start from here: python-paillier docs
在安装phe(Partially Homomorphic Encryption)库之前,注意文档中的提示:
所以python版本>=3.3就可以了吗?并不是。我们接着要去PyPI单独看一下phe的安装说明:phe(插一句,PyPI真的是个非常好用的和python相关的各种包的安装集合地)
注意这里在安装phe之前它推荐安装gmpy2,虽然不是必须的,但gmpy2做大数计算和精确计算以及提高计算效率都很有帮助。
我觉得此非必须为必须,因为装完所有的东西之后,我们需要一些demo来跑一跑,这些demo大多没有例外都是依赖gmpy2的。
说到gmpy2,这是一个简单的东西吗?不,现有的gmpy2并不支持在python3.5以后的环境中运行,最后的维护更新在2016年(血和泪的教训)。因此剩下的选项只剩Python3.3.x和Python3.4.x了。
我去官网下了python v3.4.10,官方release的最后一个3.4版本。当然如果有特殊需要你可以去各种非官方有人维护的站下到别的版本。记住安装python的路径,以便添加环境变量和后续安装其他package的操作,我放在了"C:\python34"路径下
顺便提一句,可能是python3.4版本相对老旧的原因(我写下这些时python已经更新到3.8.x了),直接用如下的方式并不能100%有效安装一些package,比如NumPy就不可以(后面再说NumPy)
pip install (xxx)
因此有时候需要借助.whl文件安装某个工具,甩个非官方但包罗万象的链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/
来这里:gmpy2下载我们需要的版本,下载之前注意,和前一步python版本的匹配:
cp34表示适配python3.4,后面根据操作系统位数选择,我是64位,因此选了图中mark的那个。(这里的amd64并没有处理器种类的限制,你的处理器是intel或者amd只要是64位都可以用这个,据说是因为建立在x86-64标准上的64 bit系统是AMD公司开发的,具体并不懂,感兴趣可以去延申了解一下)
下一步,将.whl文件放在python路径的Scripts文件夹下,我就放在了"C:\python34\Scripts"目录下。
接着在cmd或者powershell打开Scripts目录,执行pip install + .whl文件名即可,我执行:
pip install gmpy2-2.0.8-cp34-none-win_amd64.whl
显示安装成功,再进行下一步。
如果上面的步骤都成功了,那么直接在Scripts下执行:
pip install phe
选择在Scripts下纯粹是为了方便找到安装文件,也可以选择其他目录。
可以同时安装phe的命令行模块,具体参照 python-paillier docs中执行如下,但版本应该已经更到1.4了,这并不重要。
pip install "phe[cli]>1.2"
无论是跑demo还是写一个功能模块,NumPy自带的函数库应该都可以解决不少麻烦,强烈建议安装。
我就这么去pip install numpy了,结果:
到这里我已经踩了诸多坑,看到>=3.5那一刻我忍不住要爆粗口了。别着急,还记得.whl文件这个东西吗?我们可以去下一个鸭!
于是我去了前面甩的这个包罗万象https://www.lfd.uci.edu/~gohlke/pythonlibs/很多时候的确有用,但在这里我并没有找到适合安装的numpy版本,试了两个都显示该平台不支持该轮子(看不清就别看了,我知道瞎眼,下次改一下颜色)
这里放一个有更早版本numpy轮子的链接:https://pypi.anaconda.org/carlkl/simple/numpy/我试了1.9.x是可以的,操作方式与gmpy2轮子安装过程相同。
到这里差不多大功告成了,不妨参照python-paillier文档写几行测试一下Paillier的同态性
from phe import paillier
# generate a public key and private key pair
public_key, private_key = paillier.generate_paillier_keypair()
# start encrypting numbers
secret_number_list = [3.141592653, 300, -4.6e-12]
encrypted_number_list = [public_key.encrypt(x) for x in secret_number_list]
# decrypt encrypted number and print
print([private_key.decrypt(x) for x in encrypted_number_list])
运行OK,解密结果和加密结果相同
再通过计算测试一下同态性,可以发现phe中的paillier支持同态相加以及密文与明文的加法和乘法计算,同时也验证了paillier的性质不支持乘法同态:
禁商用,转载搬运随意。看到这里如果觉得有用,请点个赞叭~