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;
}

那么我们本周的分析先到此为止。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐