天天看点

Pyfhel库学习1

上个博客介绍了一下Pyfhel这个同态加密库的安装,今天就来学习一下其用法。其官方稳定版的doc文件在pyfhel.readdocs.io,大家可以自己去看一下。下面我就自己翻译一下这个内容。

Pyfhel是一个python版的同态加密库。该库是基于C++的库开发的,当前版本只支持微软开源的SEAL库。

  1. Pyfhel.Pyfhel类,支持加密后的整型和双精度浮点型数的加法、乘法、减法和幂指数的运算。同态加密的应用是基于SEAL/PALISADE/HELIB开发的。Pyfhel用PyPtxt格式的明文类和PyCtxt格式的密文类。具体的例子如下:
from Pyfhel import Pyfhel, PyPtxt, PyCtxt
# 实例化一个Pyfhel
HE = Pyfhel()
HE.contextGen(p=65537)
HE.KeyGen()#注意:文档里给了参数p=65537,但测试的2.2.1版本并不需要该参数,在HE.ContextGen(p=65537)里已经确定了

#下面四行其实可以用两行,这里是先编码然后再加密。其实可以直接用
# c1 = HE.encryptInt(2)
# c2 = HE.encryptInt(4)
p1 = HE.encode(4)
p2 = HE.encode(2)
c1 = HE.encrypt(p1)
c2 = HE.encrypt(p2)
# 密文的加法
c1 = c1 + c2
p_res = HE.decrypt(c1)
#如果要用print输出,还需要如下的操作,因为p_res的类型还是PyPtxt.或者用HE.decryptInt(c1)直接将c1转为int型
print(HE.decode(p_res))

#这样输出结果就是6.
           

1.

add(PyCtxt ctxt, PyCtxt ctxt_other, bool in_new_ctxt=False)

该函数是完成两个PyCtxt型的密文加法。两个PyCtxt编码格式必须一样,是同一个context(这里我翻译成背景,其实就是同一个上文中HE.contextGen(p=65537)同一个HE加密产生的两个PyCtxt)和同一个公钥。返回值会赋给第一个ctxt.

参数:            
           
  • ctxt(PyCtxt): 密文加数1
  • ctxt_other(PyCtxt):密文加数2
  • in_new_ctxt(bool=False):该参数默认是False,不产生一个新的PyCtxt格式的密文,而是将两个密文加数的结果传给ctxt;如果该参数设置成True,则会创建一个新的PyCtxt格式的密文。

    返回值:

    两个加数的和,该结果是PyCtxt格式的,如果in_new_ctxt是False(默认),则将结果传给第一个加数,否则将返回一个新的PyCtxt格式的密文。

#接着上面的一段代码测试:
HE.add(c1, c2)
print(HE.decryptInt(c1))
#此时的结果应该是8,因为前面有c1 = c1 + c2,现在又将c1+c2的结果传给了c1

c3 = HE.add(c1, c2, in_new_ctxt=True)
print(HE.decryptInt(c3))#输出为10
print(HE.decryptInt(c1))#输出为8
           

2.

add_plain(PyCtxt ctxt, PyPtxt ptxt, bool in_new_ctxt=False)

一个密文加一个明文的和,in_new_ctxt默认的话将二者相加的和传给第一个数。要求明文必须用产生密文的HE来encode,也意味着二者有同样的公钥。

参数:

  • ctxt (PyCtxt):一个数的密文,其将加另一个明文的ptxt。
  • ptxt (PyPtxt):一个数的明文,只是encode,并未encrypt。
  • in_new_ctxt (bool=False):这个参数跟add里面的最后一个参数的用法一样。

返回值:

返回二者和的密文。

c4 = HE.add_plain(c3, p1)
print(HE.decode(HE.decrypt(c4)))#输出14
           

边学习,边写这个博客吧。未完待续~