Pyfhel库中包含的内容十分丰富,可以从Pyfhel/examples入手,来体验如何使用Pyfhel。下面具体展示其中的BFV方案使用实例。
BFV实例
BFV (Brakerski-Fan-Vercauteren) 方案是一种基于环上的学习困难问题的同态加密方案。BFV方案允许对编码后的整数进行加密,然后进行同态加密操作(如加法和乘法),最后能够解密出一个近似的结果。论文:BFV
声明参数
1 | HE = Pyfhel() |
‘n’:环的度数。环度指的是同态加密使用的多项式的最大次数加1,因为多项式的次数是从0开始的。这里的值是$2^{13}$,意味着多项式最大次数为$2^{13} - 1$。可以看成是明文数组的长度(明文槽的数量),这些数组中的元素会被编码为一个单一的密文
注意:环度越大,表示能处理的数据量也越大,但计算复杂度也会增加
‘t’:明文模数。通常用于将明文编码为多项式以及从多项式解码。必须是一个素数满足$t - 1$能被$2^n$整除
‘t_bits’:$t$的比特数。用于生成合适的$t$。如果指定该值就会覆盖上述的$t$值
‘sec’:安全参数。AES密钥的等效长度(以比特位为单位)。用于设置密文模数$q$,可在{128,192,256}中选择。越大意味着越安全,但更低的计算效率
构造密钥
1 | # 生成BFV方案的context |
生成测试数据
- 定义两个1D的整型数组,编码并加密
1 | # 生成整型数组 |
同态计算
密文/明文必须建立在同一个context下
密文-密文操作
1
2
3
4
5
6
7
8ccSum = ctxt1 + ctxt2
ccSub = ctxt1 - ctxt2
ccMul = ctxt1 * ctxt2
cNeg = -ctxt1
cSq = ctxt1 ** 2
cPow = ctxt1 ** 3
cRotR = ctxt1 >> 2
cRotL = ctxt1 << 2密文-明文操作
1
2
3
4cpSum = ctxt1 + ptxt2
cpSum1 = ptxt2 + ccMul
cpSub = ctxt1 - ptxt2
cpMul = ctxt1 * ptxt2乘法重线性化:密文-密文之间的乘法会导致生成的密文多项式的次数增加。为了防止这种增长,通过使用重现性化技术(通常在每次c-c mult之后),从而降低密文多项式的次数到最小规模(两个多项式c0 & c1)
1
2
3
4
5
6print("Relinearization-> Right after each multiplication.")
print(f"ccMul before relinearization (size {ccMul.size()}): {ccMul}")
~ccMul
print(f"ccMul after relinearization (size {ccMul.size()}): {ccMul}")
print(f"cPow after 2 mult&relin rounds: (size {cPow.size()}): {cPow}")
解码并解密
- 将密文信息进行解码&解密,并进行显示输出
1 | r1 = HE.decryptInt(ctxt1) |
结语
以上实例具体在Pyfhel/examples中,有需要可以自行查阅源码。