
半同态加密(Partially Homomorphic Encryption, PHE):只支持加法或乘法中的一种运算。其中,只支持加法运算的又叫加法同态加密(Additive Homomorphic Encryption, AHE);
部分同态加密(Somewhat Homomorphic Encryption, SWHE):可同时支持加法和乘法运算,但支持的计算次数有限;
全同态加密(Fully Homomorphic Encryption, FHE):支持任意次的加法和乘法运算。

在联邦学习中,不同参与方训练出的模型参数可由一个第三方进行统一聚合。使用加法PHE,可以在明文数据不出域、且不泄露参数的情况下,完成对模型参数的更新,此方法已应用在实际应用(如FATE[31])和多个顶会工作中(如SIGMOD[4]、KDD[7]、ATC[18]);
在在线广告投放的场景中,广告主(如商家)在广告平台(如媒体)投放在线广告,并希望计算广告点击的转化收益。然而,广告点击数据集和购买数据集分散在广告主和广告平台两方。使用PHE加密结合隐私集合求和(Private Intersection-Sum-with-Cardinality, PIS-C)协议[19]可以在保护双方隐私数据的前提下,计算出广告的转化率。 该方案已被Google落地应用[20];
在加密数据库SQL查询场景,在数据库不可信的情况下,可以通过部署协议和代理来保护请求者的查询隐私。其中,PHE可以用来完成安全数据求和和均值的查询[9]。
2)乘法三元组生成
KeyGen():密钥生成算法。用于产生加密数据的公钥PK(Public Key)和私钥SK(Secret Key),以及一些公开常数PP(Public Parameter);
Encrypt():加密算法。使用PK对用户数据Data进行加密,得到密文CT(Ciphertext);
Decrypt():解密算法。用于解密得到数据原文PT(Plaintext)。
Add():同态加算法。输入两个CT进行同态加运算。
ScalaMul():同态标量乘算法。输入一个CT和一个标量PT,计算CT的标量乘结果。
随机选择两个大素数p, q满足 g c d ( p q , ( p − 1 ) ( q − 1 ) ) = 1,且满足p,q长度相等 计算n = pq以及
= lcm(p-1,q-1),这里lcm表示最小公倍数,|n|为n的比特长度随机选择整数 
定义L函数:
,计算
,
)输入明文消息m, 满足 
选择随机数r满足 
计算密文 
输入密文c,满足 
计算明文消息 
对于密文
和
,计算
对于密文
和标量a,计算





密钥生成阶段不同
在密钥生成阶段,生成RSA素数要求
,且
。随机选择
,计算
。计算
。私钥为
,公钥为
。
加密过程优化
,其中计算r^n的部分可被优化:
来替换原算法的r^n,可以实现相同的安全性。这里的随机数
,相比原算法的
,比特长度减小了一半,计算时更加快速。
,使得在
下的运算可转化为在
的运算。在转换到
上后,计算效率更高,从而该性质可用于让我们在模下加速模指数运算。
时,有以下两种计算方法:直接计算法:计算
。这是在
上的运算,计算量较大。 使用CRT优化:使用CRT,先把
映射到
上去做计算,再把结果聚合回
上,得到最终结果。
(映射到
)计算
在
上的映射
。其中
;根据欧拉定理[45],
, 这里的
为p的欧拉函数。 (映射到
)计算
在
上的映射
,过程同上。 (聚合回
)使用CRT通项公式,计算 


。
下做的模指数运算。在拥有私钥(n的分解p、q)的情况下,可以使用CRT将
下的模指数运算转化到
和
上,从而提升加解密效率。
对于fixed-base情况,进行指数预计算来加速模乘
上计算模指数)。对于这种情况,可以使用预计算的方法,提前算好一些指数运算结果并保存,使得在线加解密的模指数计算转化为模乘运算。
),并存入列表中。当进行加密解密的模指数运算时,测试指数的每一bit是否为1,使用预计算的列表计算结果。经过此优化,1次模指数转化为|n|/2次(平均)模乘。在Java上,若使用上述按单个bit展开的方法,|n|/2次(|n|=3072)耗时比1次模指数要长,没有达到优化计算的效果。
次(平均)模乘,同时会产生
的预计算List开销。当w设置得越大,在线的模指数计算越快,同时需要预先生成并传输、存储的预计算List也越大。 具体的性能提升结果见表4.2,预计算List的大小随w的变化见表4.3。窗口大小w需要根据场景灵活选择,来获得最佳的性能/通信平衡。在存储空间有限时,可以采用更轻量级的预计算方法来减小存储开销[41][42],在c/c++下预计可以达到一定加速效果。 这里的模乘我们使用Java中的Biginteger.multiply(),模指数使用Biginteger.modpow()。

在加解密时会重复用到的变量,都在密钥生成过程提前计算并保存,以避免加解密时的重复运算。
使用JNI调用C++库提升效率的代价是会丧失程序的可移植性(C/C++是非跨平台语言),故是否使用JNI要根据场景灵活选择。

打包 根据Paillier方案中n的比特长度|n|和单个明文的比特长度
,计算明文空间可容纳的最大明文数量
。 以k个明文为一组,需要对
进行拼接,得到
。
加密 调用Paillier加密算法,对m进行加密,得到c。
解密 调用Paillier解密算法,对c进行解密,得到m。
拆包 以k个明文为一组,拆分m得到
。






不能泄露双方交集的个体用户信息,否则不满足法律规定的“最小够用”原则,故“先进行PSI再求和”的方法不可取。 不能泄露交易金额给广告平台方。

MySQL高级应用 - 索引和锁
文章转载自阿里技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




