Ada2pro's blog

Waiting for love

0%

CKKS学习笔记

我最近需要学习CKKS,我之前看过openmined的教程,当时看懂了,但过去了一个月,我就几乎忘得差不多了,我认为必须要自己手动进行代码实现才能加深理解,同时,师兄也推荐我去阅读CKKS的原论文


CKKS 同态加密学习路径(三层次法)

学习 CKKS 不必一次吃透。结合“框架 → 实践 → 理论”三步走,能有效打通从理解到实现的闭环。

一、建立高层框架(先见森林)

在读论文前,先掌握整体脉络,避免迷失细节:

  • 核心目标:支持浮点/实数的近似同态加密(允许一定误差)
  • 关键思想
    • 复数向量编码数据
    • 多项式上进行同态加/乘
    • 通过 rescaling 控制噪声与精度平衡
  • 主要流程
    编码 → 加密 → 同态运算 → 解密 → 解码
  • 核心挑战
    • 噪声增长 vs. 计算精度
    • 乘法次数受限 → 需 rescaling + 模数链(modulus chain)

📌 推荐材料:OpenMined 教程、简明综述或课程笔记,快速唤醒记忆。


二、动手实验(代码驱动理解)

用现成库上手,让抽象概念落地:

  • ✅ 使用库:SEAL / Lattigo / TenSEAL
  • 🔬 实验内容:
    • 跑通 CKKS 加法、乘法示例
    • 观察:加法几乎无精度损失,乘法后需 rescale
    • 手动封装完整流程:encode → encrypt → eval → decrypt → decode
    • 记录误差来源(如 rescale 引入的舍入)
  • 🧩 进阶:
    • 复现 OpenMined 示例,边跑边注释
    • 提问并尝试回答:“为什么这里要 rescale?” “乘法为何有限?”

💡 好处:再看论文时,公式=代码中的某一步,理解更直观。


三、精读原论文(带问题深入)

论文:Cheon et al., Homomorphic Encryption for Arithmetic of Approximate Numbers (2017)

分模块阅读,优先关注与代码对应的机制:

模块 学习重点
Introduction 对比 BGV/BFV,理解 CKKS 为何适合近似计算
Encoding/Decoding 复数向量如何编码实数向量?精度损失来源?
Homomorphic Ops 加法、乘法的数学形式,对应代码中的 addmul
Rescaling & Modulus Switching 核心创新!为何要除 q_i?如何维持规模?
Security & Params 安全基于 RLWE;参数选择影响安全与性能

📘 阅读技巧

  • 带着实验中的疑问去读(如:“rescale 为什么必须降模?”)
  • 公式看不懂?先找代码实现,反向理解
  • 安全性证明等硬核部分可暂时跳过

四、巩固与提升

  • 📝 写读书笔记:每部分用自己的话总结成“小白也能懂”的解释
  • 🔍 多源对照:参考 Lattigo 文档、SEAL 示例等工程化资料
  • 💬 自测能力:如果让我实现 CKKS,我能写哪部分?哪些依赖库?

✅ 可选:三周学习计划(实践导向)

周数 目标
第1周 熟悉 TenSEAL/SEAL,跑通编码、加/乘、rescaling 示例
第2周 对照论文,精读 Encoding、HomOp、Rescaling 部分,标注代码对应点
第3周 实现一个“极简版 CKKS”原型(仅支持编码+加密+加法)或写详细流程图解

这样三周下来,你不仅能读懂论文,还能讲清楚、写出来。


📌 结语
CKKS 的难点不在单一知识点,而在数学、安全、工程的交叉理解
坚持“先会用,再懂原理”,你会越学越通透。


好👌 我给你设计一个 3 周 CKKS 学习计划,目标是:

  • 不只是看懂,还能动手实现,把论文和代码结合起来。
  • 节奏循序渐进,避免“一次性啃死”。

📅 三周 CKKS 学习计划

第 1 周:重建框架 &动手实验

目标:重新建立 CKKS 的整体理解,用代码跑通基本流程。

  • Day 1-2

    • 回顾 openmined 的 CKKS 教程,写总结:

      • CKKS 解决的问题
      • 编码/加密/解密流程
      • rescale 在哪里用到
    • 输出 1 页笔记(可以画流程图)。

  • Day 3-4

    • TenSEAL 或 SEAL 跑几个 demo:

      • 加法、乘法、rescale
      • 对比误差来源
    • 给每段代码加注释,写出你“理解”的解释。

  • Day 5-6

    • 阅读 1 篇 CKKS 入门综述(比原论文轻量的资料)。
    • 总结:CKKS 相比 BGV/BFV 的不同点。
  • Day 7

    • 复盘一周:写一个“CKKS 小白笔记”,不超过两页。

第 2 周:论文精读(带问题读)

目标:啃原论文的核心部分,把公式和代码对照起来。

  • Day 1-2

    • 精读原论文 Introduction + Background
    • 写出论文想解决的痛点 & 为什么需要“近似”同态加密。
  • Day 3-4

    • 精读 Encoding & Decoding 部分
    • 在代码里跑 encode/decode,观察误差。
    • 笔记:如何把实数/复数映射到多项式?
  • Day 5-6

    • 精读 Homomorphic Addition & Multiplication
    • 跑对应代码,验证 rescale 的作用。
  • Day 7

    • 输出一份“代码-公式对照表”。

第 3 周:实现 &深化理解

目标:动手写简化实现,把 CKKS 的机制讲出来。

  • Day 1-2

    • 尝试实现“玩具版 CKKS”:

      • 只做 encode → encrypt → decrypt → decode(用 Python/Numpy)
      • 暂时不管安全性。
  • Day 3-4

    • 加入加法、乘法运算,手动实现 rescale(哪怕是简化版)。
  • Day 5

    • 对照论文 Security 部分,理解为什么要选择那么大的参数。
    • 可以查一下 Lattigo/SEAL 的参数推荐。
  • Day 6

    • 写一篇“CKKS 学习笔记”:

      • 论文精华
      • 代码实验总结
      • 哪些地方还没弄懂(留下问题)。
  • Day 7

    • 分享/讲解(假设要给别人讲 CKKS,你会怎么讲?)

✨ 最终成果:

  • 3 周后你会有:

    • 一份完整的 CKKS 学习笔记
    • 一份“代码-公式对照表”
    • 一个玩具版 CKKS 小实现
    • 对原论文核心思路的理解

要不要我顺便帮你整理一些 论文 + 教程 + 库文档 的推荐阅读清单?这样你就不用自己到处找资料了。