我最近需要学习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 | 加法、乘法的数学形式,对应代码中的 add 和 mul |
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 小实现
- 对原论文核心思路的理解
要不要我顺便帮你整理一些 论文 + 教程 + 库文档 的推荐阅读清单?这样你就不用自己到处找资料了。