近期刚接触SEAL库,本文记录该库的使用方法,具体的同态加密的原理不过多介绍,若有错误,请各位大佬批评指正。
SEAL(Simple Encrypted Arithmetic Library)是微软开源的同态加密库,基于C++11编写,代码在Github可以找到,额外依赖比较少,下载到本地编译安装就能使用了。
SEAL提供了两种机制的同态加密,BFV和CKKS。我粗略的理解为前者编码整数,而后者可以用于编码浮点数。浮点数的编码,需要scale一定的倍数,将浮点数转换成整数。SEAL采用的同态加密算法基于多项式环,其中有几个重要的参数:
polynomial modulus
coefficient modulus
plaintext modulus (只在BFV机制中)
其中polynomial modulus和max coefficient modulus bit-length有一个对应关系,示例代码中给出了对应关系,比如1024 对应27,8192对应218。SEAL提供了默认设置的函数,其中polynomial modulus是必须设置的。本文主要讨论CKKS机制的用法,针对浮点数进行同态加密。
在SEAL中有一个重要的level的概念,根据示例代码里的注释,可以理解为SEAL根据默认的参数创建了一个modulus switching chain ,在同一个链上的加密实例除了coefficient modulus 其他都相同。下面示例代码给的一个解释:
coeff_modulus: { 50, 30, 30, 50, 50 } +---+ Level 4 (all keys; `key level