做网站的公司找客户,高校信息公开网站建设,买了域名怎么用,动漫王也头像RLWE同态加密的明文域
RLWE的加密方案#xff0c;如BGV、BFV#xff0c;加密的对象#xff0c;实际上是分圆多项式环上的一个整系数多项式。而我们在平时接触到的需要加密的数据#xff0c;如图像或者工资#xff0c;通常是一个数。所以#xff0c;在使用RLWE同态加密时…RLWE同态加密的明文域
RLWE的加密方案如BGV、BFV加密的对象实际上是分圆多项式环上的一个整系数多项式。而我们在平时接触到的需要加密的数据如图像或者工资通常是一个数。所以在使用RLWE同态加密时需要将数转化为多项式这就是同态加密的明文编码或者叫做明文的打包。
打包并不是说将数直接映射到多项式就可以了我们需要保持打包的同态性质这样才能使得同态运算的结果保持真正的同态性质。本文主要介绍更适用于加密同态加密的打包方法系数打包。也就是将剩余环 Z T \mathbb{Z}_T ZT中的元素映射到多项式环 Z T [ x ] / ( x N 1 ) \mathbb{Z}_T[x]/(x^N1) ZT[x]/(xN1)上。
单系数打包
最朴素的思想就是一个数对应于一个多项式。设需要加密的数为 a a a, 则我们可以用 a a a构造一个多项式使得打包是加法同态的。
将 a a a作为多项式的一个系数其他的系数随机生成。将 a a a切分到多个系数剩余的系数使用随机数。
方法1
固定位置 i i i构造的明文多项式的第 i i i个系数等于需要打包的明文 a a a。
则 P p 0 p 1 x p 2 x 2 ⋯ p i x i ⋯ p N − 1 x N − 1 Pp_0p_1xp_2x^2\cdotsp_ix^i\cdotsp_{N-1}x^{N-1} Pp0p1xp2x2⋯pixi⋯pN−1xN−1,其中 p i a p_ia pia.
接下来我们证明这种打包是加法同态的。 假设明文 b b b打包成的明文多项式为 Q q 0 q 1 x q 2 x 2 ⋯ q i x i ⋯ p N − 1 x N − 1 Qq_0q_1xq_2x^2\cdotsq_ix^i\cdotsp_{N-1}x^{N-1} Qq0q1xq2x2⋯qixi⋯pN−1xN−1,其中 q i b q_ib qib. 那么 S P Q ∑ j 0 N − 1 ( p j q j m o d T ) x j SPQ\sum_{j0}^{N-1}(p_jq_j \mod T)x^j SPQj0∑N−1(pjqjmodT)xj 加法并不会导致多项式的次数增加所以 S S S的次数为 N − 1 N-1 N−1. 所以 S S S的第 i i i个系数 s i ≡ a b m o d T s_i\equiv ab \mod T si≡abmodT. 也就是打包是加法同态的。
方法2
将 a a a切分成随机的 k k k份然后将这 k k k份作为明文多项式的其中一部分系数。 a a 0 a 1 ⋯ a k − 1 m o d T aa_0a_1\cdotsa_{k-1} \mod T aa0a1⋯ak−1modT. 则 P a 0 a 1 x ⋯ a k − 1 x k − 1 p k x k p k 1 x k 1 ⋯ p N − 1 x N − 1 Pa_0a_1x\cdotsa_{k-1}x^{k-1}p_kx^kp_{k1}x^{k1}\cdotsp_{N-1}x^{N-1} Pa0a1x⋯ak−1xk−1pkxkpk1xk1⋯pN−1xN−1. 同样由于加法不会导致多项式次数增加从而模 x N 1 x^N1 xN1所以这样的打包是加法同态的。
相比于方法1这样打包可以使得当 T T T较小的时候需要加密的数很大而且需要的加法次数比较多的时候能避免溢出从而保持正确的结果。
SIMD系数打包
SIMD是单指令多数据Single Instruction Multiple Data的缩写。对应于打包也就是将 d d d个数映射为一个多项式 d d d叫做打包的批次大小。SIMD系数打包是单系数打包的一般性推广也就是单系数打包是打包批次为1时的SIMD打包。
设要加密的数据为 A ( a 0 , a 1 , a 2 , ⋯ , a d − 1 ) A(a_0,a_1,a_2,\cdots,a_{d-1}) A(a0,a1,a2,⋯,ad−1)则 P a 0 a 1 x a 2 x 2 ⋯ a d − 1 x d − 1 p d x d p d 1 x d 1 ⋯ p N − 1 x N − 1 Pa_0a_1xa_2x^2\cdotsa_{d-1}x^{d-1}p_dx^dp_{d1}x^{d1}\cdots p_{N-1}x^{N-1} Pa0a1xa2x2⋯ad−1xd−1pdxdpd1xd1⋯pN−1xN−1 这样的打包方式显然是加法同态的。
代码示例
在OpenFHE中实现了SIMD的系数打包但是其效率并不是很高。 下面是一个怎么使用系数打包的例子。
/*
OpenFHE test code by zyf.
coefficient packing example of bgv.
*/
#includeiostream
#includeopenfhe.h
//The functions or classes of OpenFHE are in the namespace lbcrypto
using namespace lbcrypto;
using namespace std;int main(){// set the parameters of bgvCCParamsCryptoContextBGVRNS parameters;//plaintext modulusparameters.SetPlaintextModulus(536903681);//set the multiplication depthparameters.SetMultiplicativeDepth(4);CryptoContextDCRTPoly cryptoContext GenCryptoContext(parameters);//enable the functions of scheme.cryptoContext-Enable(PKE);cryptoContext-Enable(LEVELEDSHE);//cryptoContext-Enable(ADVANCEDSHE);KeyPairDCRTPoly keyPair;//generate keykeyPair cryptoContext-KeyGen();cryptoContext-EvalMultKeyGen(keyPair.secretKey);//coutring dimension cryptoContext-GetCryptoParameters()-GetElementParams()-GetRingDimension()endl;//original datavectorint64_t v1 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};vectorint64_t v2 {-1, -2, -3, 1, 2, 3, 4, 5, 6, 7, 8, 9};//pack the original data to plaintext polynomialPlaintext p1,p2;p1cryptoContext-MakeCoefPackedPlaintext(v1);p2cryptoContext-MakeCoefPackedPlaintext(v2);//encryptionauto c1 cryptoContext-Encrypt(keyPair.publicKey, p1);auto c2 cryptoContext-Encrypt(keyPair.publicKey, p2);auto sumc1c2;//decryptionPlaintext ans_sum;cryptoContext-Decrypt(keyPair.secretKey,sum,ans_sum);coutans_sumendl;
}