SEAL全同态加密开源库(九) CKKS-源码浅析
·
SEAL全同态加密开源库(八) CKKS-源码浅析
2021SC@SDUSC
2021-11-28
介绍
这篇文章我将从CKKS的源码进行入手,进一步理解CKKS的内部加密解密以及简单的加减乘等操作。
源码分析
生成公钥
在我之前的博客中,大体介绍了加密解密以及简单的加法,可以再去回顾一下,以便于了解。
生成组成公钥的要素 “ a ”
Element a(dug, elementParams, Format::EVALUATION);
生成秘钥 “ s ”
Element s;
给秘钥s进行赋值
不使用预先计算池中的随机多项式,分两步完成。支持离散高斯分布(RLWE),三元均匀分布(优化)和稀疏分布(sparse)情况。
switch (cryptoParams->GetMode()) {
case RLWE:
s = Element(dgg, elementParams, Format::COEFFICIENT);
break;
case OPTIMIZED:
s = Element(tug, elementParams, Format::COEFFICIENT);
break;
case SPARSE:
s = Element(tug, elementParams, Format::COEFFICIENT, 64);
break;
default:
break;
}
s.SetFormat(Format::EVALUATION);
生成并设置公钥
// privateKey->MakePublicKey(a, publicKey);
Element e(dgg, elementParams, Format::COEFFICIENT);
e.SetFormat(Format::EVALUATION);
//公钥b的生成
Element b = e - a * s;
调用上述方法给kp赋值并返回结果
kp.secretKey->SetPrivateElement(std::move(s));
kp.publicKey->SetPublicElementAtIndex(0, std::move(b));
kp.publicKey->SetPublicElementAtIndex(1, std::move(a));
// 给kp的是三个参数进行赋值 kp = (b, a)=(- a.s + e, a)
return kp;
实现密文之间的加法
主函数调用下面的方法
template <class Element>
Ciphertext<Element> LPAlgorithmSHECKKS<Element>::EvalAddCore(
ConstCiphertext<Element> ciphertext1,
ConstCiphertext<Element> ciphertext2) const {
Ciphertext<Element> result = ciphertext1->Clone();
//EvalAddCoreInPlace方法下面进行了定义
EvalAddCoreInPlace(result, ciphertext2);
return result;
}
那么我们本周的分析先到此为止。
更多推荐
已为社区贡献1条内容
所有评论(0)