资讯详情

【FHE 同态加密】我们如何实现同态加密推理(十一):密文链协议——两条不变式,和 112 与 2100 的素数分工

📅 2026/10/12 18:26:00 | 华诺云谱 👁 阅读
【FHE 同态加密】我们如何实现同态加密推理(十一):密文链协议——两条不变式,和 112 与 2100 的素数分工
【FHE 同态加密】我们如何实现同态加密推理十一密文链协议——两条不变式和 112 与 2100 的素数分工关键词同态加密 FHE 密文链协议 lay boot 接力 素数分工 112 2100 大模型密文推理导读整条同态加密推理链的契约窄到可以写在信封背面每一跳是一个幂等的纯函数下一棒不需要知道上一棒是谁也不需要信任他。本篇讲清两条不变式、112 与 2100 个素数的分工以及这套密文接力协议为什么能让可复现、可验证成立。项目仓库Gitee 主仓https://gitee.com/pei-xiaoguang/kestrel-llmGitHub 镜像https://github.com/m13253246268-ship-it/kestrel-llm相关文档术语与数据口径 性能与基准 构建与复现 快速上手 架构总览0. 一句话结论整条链的契约窄到可以写在信封背面layL : u(L-1)r112 ──→ uL bootL: uL ──→ u(L)r112每一跳都是一个幂等的纯函数给定输入密文 编译好的驱动 同一把私钥输出唯一。这就是接力在工程上能成立的全部理由——下一棒不需要知道上一棒是谁也不需要信任他。1. 两条不变式不变式内容为什么重要输入形态固定每一跳的输入永远是已刷新、链长 112的密文任一棒拿到的都是同一种东西不用为上游差异写分支输出形态固定每一跳产出 8 枚密文4 个 token 位置 × 2 个分量交接包结构统一验证脚本可以通用第二条里的8值得解释这一层同时处理4 个 token 位置而 CKKS 密文有2 个分量comps 2重线性化之后。所以4 × 2 8。2. 阶段表T23_PHASE驱动用环境变量T23_PHASE选择这一跳是哪一种源码里的定义原文:intphase0;/* 0l0 1boot 2l1(M2 layer1) 3t26(layer26) 4t27(layer27) 5fin 6lay */intlay-1;/* phase6: T23_LAY 指定中间层 0..25 */T23_PHASE含义参考前缀权重目录0l0第一层生成私钥l0_tail/w01boot自举刷新——2l1M2 阶段的第一层—.tmp_tok/l1w3t26第 26 层l26_tail/w264t27第 27 层l27_tail/w275fin收尾norm / logits——6lay中间层用T23_LAY指定l{L}_tail/w{L}中间层的层号由T23_LAY指定合法范围[0, 27]代码里有显式检查越界直接退出。阶段3/4/6走同一套参数g_fold1024.0;g_chk4096.0;g_refprepref;g_causal1;注意g_causal 1中间层与尾层都是因果注意力这符合自回归语言模型的事实而g_fold/g_chk是这一个阶段的折叠与校验尺度。3. 为什么lay只要 112而boot要 2100这是最初最让人困惑的一点同一层数据为什么两个程序编的链长差近 20 倍程序编译期链长实际看到的链长原因t23lay112输入 112 → 输出16层内前向只需要够用的链t23boot2100输入 16 → 输出112自举内部的sin折叠约需 31 层深度本系列第 7 篇关键区分编译期链长 该程序支持的最大链长也就是它的内存上界实际链长 这一刻密文上真正剩多少素数。所以t23boot编到 2100不代表它跑的时候链上真有 2100 个素数——它只是必须准备那么多空间因为modraise那一步第 7 篇会先把链抬满再做几十层深的折叠。这也直接解释了为什么boot比lay慢得多、吃内存多得多lay0 : 1920 s工作集 ≈1.0 GB boot0 : 4285 s链长 np2100建议内存 ≥8 GB4. 私钥从哪来一把钥匙贯穿全链这是个容易被忽略但很关键的设计点if(phase0)ckks_sk_gen(sk,(uint32_t)n);elseif(t23_sk_load(sk,.tmp_tok/chain/sk.bin)!0){printf(sk load fail\n);return1;}只有phase0第一层生成私钥其余所有跳都从.tmp_tok/chain/sk.bin读同一把。含义有两面好的一面接力者之间不需要传密钥分发协议——sk.bin就在数据包里也因此这个包不能公开分发它只适合熟人/内部接力必须诚实的一面sk.bin出现在接力包里意味着任何拿到包的人都能解密整条链。这不是设计缺陷而是机制验证这一阶段的必然——我们还没有做密钥托管或分段解密。另外只想生成密钥时可以走T23_KEYONLY1驱动会打印KEYONLY: sk.bin saved后退出。这对搭建测试环境很有用注意生成目录必须先建好驱动用裸fopen落盘、不会自建目录。5. 交接包与断点续跑一跳的产物只有三样chain/u{L}r112_{t}_{h}.ct # 8 枚密文单文件 ≈3.5 MB relay_rerun/{lay,boot}{L}.out # 日志 manifest.sha256 # 逐文件哈希可自校验而跑层脚本rerun5_lay_boot.ps1有一个很实用的性质已有产物自动跳过。也就是说跑到一半中断重跑不会从头再来层与层之间天然可并行不同的人跑不同的层互不阻塞。这是横向切链这个设计的直接红利——它不只是为了省内存也是为了让人可以各跑一段。6. 一处照实标注的未核实项boot的日志里会打出out np2083按文档口径这一行出现8 次每层 4 token × 2 分量视为刷回满链的判据。但**2083与编译期2100、落盘112之间的精确对应关系本文不做断言**——它涉及modraise抬升到多少、以及折叠过程中又消耗了多少个素数。这个数字需要以源码为准逐行确认我不在这里凭推测解释它。这条按本项目纪律标注未核实的东西不写结论宁可留一个洞不给一个猜测。7. 安全边界务请读完本文所述参数为机制验证级n2048、112 素数内层链、2100 素数自举链 远低于 HE 参数标准的 128-bit 水平不得用于保护真实数据。 本文主张的是链协议的不变式与工具链行为。 本文不主张安全强度、性能优越性。特别提醒 §4sk.bin与密文一起在接力包里流转——这套机制目前不具备服务提供方看不到数据的性质请勿据此宣传任何隐私保证。8. 这一篇的未解问题协议没有版本号。如果引擎参数变了比如链长从 112 改成 128旧包和新包长得一样但互不兼容。目前靠文档约定 论文式对齐来避免混用没有机制上的防护。交接包不带输入指纹。下一棒无法验证我拿到的u{L-1}r112就是上一棒声明的那个——只能验哈希如果上一棒把哈希公开的话。这在本系列第 14 篇里作为验证学的第 4 条未解问题出现过。phase 2 (l1)与phase 6 (lay)的语义有重叠。它们都做中间层前向区别来自开发阶段M2 阶段只有一层。对新人来说这是历史包袱。fin阶段的门槛与前面几层不同它的输出是对齐 logits 而不是密文链的下一跳这一点在协议文档里描述得不够显眼——我们自己在复现时就撞过。下一篇回到工程侧为什么我们把 OpenMP 换成了自研线程池。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑