想象一台精密的手术:外科医生的双手被特殊手套包裹,全程看不见血迹和脏器,却能精准地缝合、切除、止血。手术结束,脱下手套——病人的伤口已被完美处理,而医生的手依然干净如初。这就是同态加密的魔法:数据在“加密手套”的保护下完成全部计算,中途任何人都看不到数据内容,结果却与明文计算完全一致。微软开源的 SEAL 库,就是这套“加密手术”的标准化工具箱。它让工程师们可以在密文上直接做加法、乘法,而无需解密。本文将从零开始,用“手套”作为贯穿始终的隐喻,带你搞懂 SEAL 的安装、BFV 与 CKKS 两大方案,以及如何用代码开启第一场“加密手术”。
隐私计算是 AI 落地的必经之路,掌握 SEAL 意味着你拥有了在“看不见数据”的前提下完成数据协作与模型推理的硬核技能,这是数据科学家与隐私工程师的分水岭。
目录
可视化演示
SEAL是微软开源的同态加密库,支持在密文上直接进行算术运算,是实现隐私计算的重要工具。本文介绍SEAL的安装... 切换模式查看不同维度。
本节配有交互动效(进入视口后自动加载,约 3KB)。
SEAL库的:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现
认识 SEAL:加密计算的手术器械箱
想象一间顶级手术室,所有器械被整齐收纳在标准化的工具箱里:手术刀、持针器、缝合线各有其位。微软开源的 SEAL 库,就是密码学界的这样一套标准化器械箱。它全称 Simple Encrypted Arithmetic Library,专门解决一个问题:如何在加密数据上直接做算术运算。
普通人理解的加密是“锁起来”——数据加密后只能存、不能算,要用时先解密,算完再加密,中途数据暴露在明文状态。SEAL 打破了这一惯例。它基于格密码(Lattice-based Cryptography)中的 RLWE 难题,把“加密”做成了“戴上手套”:数据被装入密文形态后,加法、乘法照常进行,外人看到的只是一堆随机数。
技术上,SEAL 支持两种主流方案:BFV(适用于整数精确计算)和 CKKS(适用于浮点数近似计算)。安装方式也很亲民,C++ 用户可直接编译源码,Python 用户通过 pip install seal 就能装好对应绑定。它的同态性质可以浓缩为一个优雅的等式:
认识了这套器械箱,你就能理解为什么 SEAL 被称为隐私计算领域最趁手的工具之一。接下来,我们走进手术室,看看手套究竟是怎么戴上去的。
- 加密运算 \(E(\cdot)\)把明文数据“放进手套”,也就是用公钥将数据转换为密文。
- 密文域运算 \(\oplus\)在密文上直接进行的加法或乘法,整个过程中手套从未脱下。
- 等价关系 =等式两边最终解密会得到一致结果,这正是“戴着手术刀做手术”能成立的根基。
加密原理:戴手套的艺术
手术室里有一套铁律:医生戴上手套后,手指的每一次触碰都隔着一层保护膜;只有脱下手套,才能真正碰到肌肤。SEAL 的加密原理与之同构——公钥是别人帮你戴上的手套,私钥是只有你能脱下的那副。
在 SEAL 中,每个参与方拥有一对密钥:公钥(public key)用于加密,私钥(secret key)用于解密。数据持有方用公钥把明文 m 加密成密文 c,然后放心地把 c 交给任何第三方去计算。第三方虽然拿着 c,却像戴着手套的医生一样,能操作、能计算,但“触觉”被完全隔离——他们看到的只是杂乱无章的随机数。
这种隔离来自数学上的 RLWE 难题:密文中混入了精心设计的“噪声”(error term),不掌握私钥的人无法剥离噪声还原明文。每次加密都会引入少量噪声,噪声在运算中不断累积——就像手套戴久了会出汗、变脏,灵敏度逐渐下降。如果噪声超过阈值,解密就会出错。这正是同态加密与普通加密最本质的不同:它把安全性建立在“噪声保护层”之上。
理解了手套的戴脱逻辑,接下来要选手套的型号了。不同的手术需要不同的手套——有的要求精确缝合针数,有的要求灵敏触觉,这就引出了 SEAL 的两大明星方案。
- 明文 \(m\)原始数据,相当于医生干净的手。
- 加密 Enc 与公钥 \(pk\)用公钥完成“戴手套”动作,得到密文 c,从此数据在保护层内工作。
- 解密 Dec 与私钥 \(sk\)只有持有私钥者才能脱下手套,精准恢复出原始数据。
BFV 方案:厚手套里的整数世界
心脏外科手术中,主刀医生需要精确数清缝合的针数,一针不能差。这种场景需要一副厚实但触感精确的手套——BFV 方案正是如此。它专为整数运算设计,加法、乘法的结果在解密后逐比特精确,没有任何四舍五入。
BFV 方案的数学舞台是多项式环,所有数据都被编码成多项式的系数。它通过三个关键参数搭建手术台:多项式模次数 \(N\)(决定手套尺寸)、系数模 \(q\)(决定手套厚度)、明文模量 \(t\)(决定能装的整数范围)。加密时,明文 m 被放大 \(\Delta = \lfloor q/t \rfloor\) 倍后混入噪声;解密时,先对密文多项式求值,再取模、整除,噪声被“挤掉”,精确的整数就浮现出来。
BFV 这副“厚手套”在需要精确计数的场景(如投票统计、金额结算)中无可替代。但机器学习的世界里,数据大多是浮点数——这时候就需要换上另一副更轻薄的手套了。
- 密文解算 \(c_0 + c_1 \cdot s\)用私钥 s 对密文两半做组合,相当于脱下手套并读取内部的“刻度”。
- 取模 \([\cdot]_q\)对系数模 q 取模,去掉计算过程中产生的“环绕回绕”,只保留有效范围。
- 还原整数先除以缩放因子 \(\Delta\),再四舍五入取整,把噪声带来的微量偏移修掉,得到精确的 m。
CKKS 方案:薄手套里的近似世界
如果说 BFV 是厚手套,那 CKKS 就是外科医生最爱的超薄丁腈手套:触感细腻,能感知细微的温差与质地,但代价是“感觉”不可能 100% 准确。CKKS 方案正是为浮点数近似计算而生的,它允许结果存在微小的、可控的误差,换来的是远超 BFV 的计算效率。
CKKS 的核心魔法在于“编码缩放”。浮点数 \(z\) 在加密前先乘上一个缩放因子 \(\Delta\)(比如 \(2^{20}\)),变成大整数再编码进多项式——这就像把精细的触感信号放大,让薄手套也能“摸得清楚”。解密后除以 \(\Delta\),得到一个非常接近原始值的近似结果。差值就是近似误差 \(e_{approx}\),它的大小由缩放因子的选择决定:\(\Delta\) 越大,精度越高,但可计算的乘法深度越浅。
选好了手套,接下来就是主刀医生的操作环节——如何用代码把这套流程跑通。
- 密文解算与 BFV 同样先做私钥组合与取模,得到的是放大后的近似明文。
- 除以缩放因子 \(\frac{1}{\Delta}\)把放大信号还原为真实尺度,相当于把信号从“放大镜”下拿回来。
- 近似结果 \( \approx m + e_{approx}\)结果与原值存在微小误差,误差大小由缩放因子和运算深度共同决定。
编程实战:主刀医生的操作手册
一场成功的手术离不开标准化的操作流程:核对器械 → 消毒 → 戴手套 → 手术 → 缝合。SEAL 编程同样有一套固定步骤,理解这套流程,你就能独立完成第一场“加密手术”。
首先设置参数与上下文(SEALContext),相当于选择手套的型号和尺寸;然后创建密钥生成器(KeyGenerator),一次性产出公钥、私钥和重线性化密钥;接着实例化加密器(Encryptor)、解密器(Decryptor)和求值器(Evaluator)——它们分别负责“戴手套”“脱手套”和“隔着手套操作”。关键的是重线性化(Relinearization):密文做完乘法后会像戴了三层手套一样臃肿,重线性化就是换上一副新薄手套,压缩密文尺寸并控制噪声。
SEAL 本身是 C++ 库,Python 用户可通过官方绑定的 seal 模块调用,API 一一对应。性能上,密文尺寸通常是明文的几十倍,运算耗时比明文慢 2 到 4 个数量级,因此参数选择要特别谨慎。一个常用的经验是 \(N=2^{15}=32768\) 配合约 218 比特的系数模,可提供 128 比特安全强度。
流程了然于胸后,就该让这套技术走出手术室,看看真实的业务场景中它如何大显身手。
- 密文加法 \(c_1 + c_2\)两个密文直接逐项相加,开销很小,好比两副手套叠在一起。
- 密文乘法 \(\otimes\)多项式乘法会让密文分量从 2 个膨胀到 3 个,噪声也急剧放大。
- 重线性化 relin借助重线性化密钥把 3 个分量压缩回 2 个,如同换上一副新手套,恢复灵巧度。
应用场景:手术室里的真实案例
加密手套最大的价值,是让多个互不信任的机构在“看不见彼此数据”的前提下完成联合计算。就像几位顶尖医生戴着无菌手套同台手术,各自操作、互不干扰,最终缝合出完美伤口。
医疗多中心联合统计是典型场景。三家医院想统计某种罕见病的发病规律,但患者数据属于高度隐私,不能出医院。用 SEAL 让每家医院加密自己的统计量,汇总后统一解密,就能得到全局结论——每个医院的原始数据从未离开本地的“手术室”。金融风控同样受益:银行与第三方数据公司联合建模时,双方将特征密文化后参与计算,既获得模型增益,又不泄露客户隐私。更前沿的还有加密模型推理——用户把输入加密后发给云端,云在密文上运行模型,返回加密结果,用户本地解密。整个过程云端“看不见”用户的输入,实现了真正意义上的隐私 AI 服务。
这些场景共享同一个数学内核:加法同态性让多方贡献可以无损聚合。设有 n 个机构,各自加密自己的数据 \(x_i\),汇总后的密文解密后正好等于所有数据之和:
场景越真实,越考验工程细节。最后一节,我们来正视那些让新手医生头疼的“术中并发症”。
- 各方独立加密 \(Enc(x_i)\)每个机构用自己的公钥加密数据,数据始终留在本地。
- 密文求和 \(\sum\)在密文域把所有贡献加起来,像收齐各手术室的缝合记录。
- 整体解密还原总和解密后得到全部数据的总和,等价于明文直接相加,但中间过程不泄露任何单方数据。
进阶挑战:手套的损耗与更换
再好的手套也有寿命:手术时间越长,汗水与摩擦让手套的灵敏度持续下降,直到必须更换。同态加密中,这个“寿命”被称为噪声预算(noise budget)。每一次乘法都会让噪声显著放大,当它超过阈值(约等于系数模 q 的一半)时,解密将彻底失败——就像手套破了,手术被迫终止。
应对噪声有三大法宝。第一是优选参数:增加多项式模次数 \(N\) 能提供更大的“通风量”,容纳更多噪声,但计算量也随之上涨;第二是控制乘法深度:设计算法时尽量减少密文乘法次数,把深度换性能;第三是 CKKS 的缩放与重缩放:浮点计算中每做完一层乘法,就通过除以缩放因子把噪声“挤掉”一部分,像定期更换新手套。
实际工程中还要面对安全性与性能的权衡。SEAL 默认推荐 128 比特安全参数,盲目调大参数换精度可能大幅牺牲速度。近年来,SEAL 与 OpenFHE、TFHE 等库各有所长,SEAL 胜在 BFV/CKKS 的成熟稳定,是入门与落地的首选。
至此,从器械箱到手术全流程,你已经掌握了 SEAL 的完整图景。记住这个不等式,它就是你评估任何同态加密方案可行性的第一直觉。
- 初始噪声 \(B_0\)加密瞬间引入的基础噪声,如同新手套刚戴上时的少量浮尘。
- 噪声放大 \(B_0 \cdot 2^{\rho}\)每做一轮乘法,噪声大约翻倍,\(\rho\) 是乘法深度。
- 安全边界 \(\frac{q}{2}\)噪声必须低于系数模的一半,这个不等式就是同态计算的“安全手术时限”。
AI 应用场景
医疗多中心隐私统计
阶段:数据准备与联邦聚合
解决的问题:传统多中心研究需要把各家医院的患者数据汇集到一处,这一过程面临极高的隐私合规风险与数据泄露隐患。SEAL 让各医院在本地加密统计指标(如患病率、均龄),密文汇总后统一解密,原始数据从不离开医院——相当于每家医院戴着“加密手套”独立完成手术,最终缝合出全局结论。
具体案例:某区域医疗联盟牵头三家三甲医院,利用 SEAL 的 BFV 方案对 10 万份病历做密文统计,计算各科室疾病分布。全程数据不出院,最终结果与明文汇总完全一致,项目顺利通过伦理审查。
金融风控联合建模
阶段:特征工程与模型推理
解决的问题:银行与征信公司互不信任,传统数据合作要么交换原始数据(违法违规),要么只能做粗粒度统计(信息损耗)。借助 SEAL 的 CKKS 方案,双方在密文上联合计算特征交叉项与评分,模型学完“看不见”任何一方的底层数据。
具体案例:某消费金融公司与三家数据服务商合作,用 CKKS 方案在加密特征上训练逻辑回归风控模型,AUC 提升 6%,同时通过监管审计——因为任何一方都无法从交互数据中还原他人的原始字段。
加密模型推理服务
阶段:模型部署与推理
解决的问题:用户把个人数据(如医疗影像特征)发送给云端 AI 服务时,传统方案中云端能“看见”输入。用 SEAL 将输入加密后上传,云在密文上运行神经网络推理(激活函数用低阶多项式近似),返回加密结果。用户解密即可得到预测,云端自始至终面对的是“密文手套”,隐私获得数学级保障。
具体案例:某健康科技公司的眼底筛查服务采用 CKKS 方案,将 512 维特征加密后上传推理,延迟 1.2 秒内返回,误诊率与明文推理相差不足 1%。
Python 演示
# -*- coding: utf-8 -*-# SEAL 同态加密库 Python 演示: BFV 方案密文整数加法try: import sealexcept ImportError: raise ImportError("请先安装 SEAL-Python: pip install seal") def main(): # 1. 选择 BFV 方案并设置参数, 相当于挑选手术手套型号 parms = seal.EncryptionParameters(seal.scheme_type.bfv) parms.set_poly_modulus_degree(4096) parms.set_coeff_modulus(seal.CoeffModulus.BFVDefault(4096)) parms.set_plain_modulus(seal.PlainModulus.Batching(4096, 20)) # 2. 创建上下文与密钥, 公钥戴手套, 私钥脱手套 context = seal.SEALContext(parms) keygen = seal.KeyGenerator(context) public_key = keygen.public_key() secret_key = keygen.secret_key() relin_keys = keygen.relin_keys() # 3. 初始化加解密器与求值器 encryptor = seal.Encryptor(context, public_key) decryptor = seal.Decryptor(context, secret_key) evaluator = seal.Evaluator(context) # 4. 加密两个整数 7 和 5 plain1 = seal.Plaintext("7") plain2 = seal.Plaintext("5") cipher1 = seal.Ciphertext() cipher2 = seal.Ciphertext() encryptor.encrypt(plain1, cipher1) encryptor.encrypt(plain2, cipher2) # 5. 在密文域完成加法, 再重线性化压缩密文 dest = seal.Ciphertext() evaluator.add(cipher1, cipher2, dest) evaluator.relinearize_inplace(dest, relin_keys) # 6. 解密并打印结果 plain_result = seal.Plaintext() decryptor.decrypt(dest, plain_result) result = int(plain_result.to_string()) print("密文计算结果: 7 + 5 =", result) if __name__ == "__main__": main()
parms = seal.EncryptionParameters(seal.scheme_type.bfv)指定使用 BFV 方案,决定“手套”的类型,这里是整数精确型。parms.set_poly_modulus_degree(4096)设置多项式模次数为 4096,相当于确定手套的尺码,尺码越大能容纳的噪声越多。keygen.public_key()` / `keygen.secret_key()生成公钥和私钥,分别负责“戴上手套”与“脱下手套”。seal.Encryptor(context, public_key)创建加密器,所有明文都将从它这里进入密文世界。evaluator = seal.Evaluator(context)创建求值器,它是“隔着手套做手术”的那双手。encryptor.encrypt(plain1, cipher1)把明文 7 加密成密文,数据自此盖上“保护膜”。evaluator.add(cipher1, cipher2, dest)在密文域执行加法,全程无人能看到真正的 7 和 5。evaluator.relinearize_inplace(dest, relin_keys)乘法后“换手套”,把膨胀的密文压缩回标准尺寸,这里对加法同样安全。decryptor.decrypt(dest, plain_result)用私钥解密,脱掉手套,得到精确的整数结果 12。
常见误区
误区我听说同态加密可以在加密数据上做计算,那是不是加减乘除、比较大小、甚至开方取对数都能直接做?那我是不是可以拿它当普通计算环境随便用?感觉它就是“加密的虚拟机”。
正解SEAL 目前只原生支持加法与乘法。除法、比较、取模这类运算必须用多项式电路去“模拟”,代价极其高昂。就像戴着手术手套可以缝合,但没法用同样的手套做磁共振扫描——工具决定了能力边界。设计算法时要优先把运算改写成“加法+乘法”的组合。
为何常见:商业宣传与科普文章通常只强调“可在密文上计算”,让初学者误以为所有运算都同样轻松。
误区我用 CKKS 加密浮点数做计算,解密出来的数字应该和明文计算一模一样吧?毕竟它叫“同态加密”,结果当然应该精确一致,不然怎么保证正确性?
正解CKKS 从设计上就是近似方案。它先把浮点数放大成整数再加密,计算过程中噪声与缩放取舍会引入微小误差。解密结果与真实值可能差在最后几位小数。适合机器学习这类本来就有容错性的场景,但如果你的场景需要精确到“分”的金额结算,请改用 BFV。
为何常见:大家习惯性地认为“加密=忠实还原”,忽略了 CKKS 为了效率主动放弃精确性这一核心设计选择。
误区两种方案都做同态加密,随便选一个用就行,反正功能差不多。我是不是只需要会调用接口,至于底层是哪个方案根本不重要?
正解BFV 适合整数、追求精确;CKKS 适合浮点、追求效率。把整数放进 CKKS 会白受近似误差之苦,把高精度浮点塞进 BFV 会因明文模量限制而溢出。选错方案如同选错手套型号——再好的手套不合手也做不了手术。
为何常见:初学者只看到 API 相似,看不到两种方案在数学结构与误差模型上的本质差异。
误区我照着教程安装了 SEAL,写了个加密加法的 Demo 跑通了,感觉性能还不错。那是不是所有同态计算都这个速度?以后直接抄默认参数用就行。
正解Demo 通常只有极浅的乘法深度和很小的数据规模。真实场景中,多项式模次数、系数模、明文模量三者相互牵制:调大尺码让噪声更宽裕,但速度会断崖式下降。参数选择必须结合具体计算深度做周密评估,否则要么解密失败,要么性能慢到不可用。
为何常见:教程的“玩具级”例子掩盖了参数工程的核心复杂度,让人误以为开箱即用。
误区计算机算加法都是纳秒级别的,那加密数据的加法最多慢个几倍吧?感觉完全可以直接用在生产环境里替代所有明文计算。
正解密文运算的代价是“数量级”级别的:密文体积是明文的几十到上百倍,同态乘法比明文乘法慢 3 到 4 个数量级,内存消耗同样剧增。同态加密不是要替代明文计算,而是用于“不得不保护隐私”的特定环节。
为何常见:常规加密(如 AES)的性能损耗很小,人们习惯性地把“加密”与“低开销”联系起来,低估了同态加密在代数结构上的沉重代价。
面试题
Q1. 下列哪项是 SEAL 的全称?
- A.Simple Encrypted Arithmetic Library← 正确答案
- B.Secure Encryption And Lock Library
- C.Standard Encrypted Arithmetic Language
- D.Safe Encrypted Application Layer Suite
答案:A。SEAL 是微软开源的“简单加密算术库”,名字直白地表达了它的定位:在密文上做算术运算。B、C、D 都是常见杜撰干扰项,注意区分“算术”与“语言”“应用层”等概念。
Q2. 同态加密允许直接在密文上执行的基本运算是哪两种?
- A.加法与乘法← 正确答案
- B.开方与取对数
- C.除法和取模
- D.字符串拼接
答案:A。SEAL 原生的同态运算只有加法与乘法,类似“隔着手套缝合”。除法、比较等操作需要多项式电路改造,开销巨大。理解这一点是评估同态加密可行性的起点。
Q3. SEAL 库的核心编程语言是什么?
- A.Python
- B.C++← 正确答案
- C.Java
- D.Rust
答案:B。SEAL 是 C++ 库,Python 通过官方绑定调用。面试官问“核心语言”时答 C++ 最准确,Python 只是上层封装的调用入口。
Q4. BFV 方案最适合处理哪类数据的计算?
- A.高精度浮点数
- B.整数明文← 正确答案
- C.自然语言文本
- D.加密的图片像素流
答案:B。BFV 是整数近似方案中的精确方案,结果逐比特还原,适合金额结算、投票统计等整数场景。浮点数应交给擅长近似的 CKKS;文本、图像都不是它的直接输入形态。
Q5. 关于 CKKS 方案,下列说法正确的是?
- A.计算结果完全精确
- B.只支持布尔逻辑运算
- C.支持浮点数近似计算← 正确答案
- D.加密过程不需要密钥
答案:C。CKKS 通过对浮点数缩放编码加密,结果是带近似误差的,非常适合机器学习。它需要密钥,也并非布尔电路,更不追求完全精确——这三个干扰项分别对应三种典型误解。
Q6. 同态密文中累积的“噪声”持续增长会导致什么后果?
- A.密文体积自动缩小
- B.解密结果可能出错← 正确答案
- C.加密速度反而变快
- D.数据不再需要公钥
答案:B。噪声像手术手套上的污渍,越积越多,超过阈值后解密会完全失败。噪声增长是同态加密的核心约束,控制它等同于控制计算深度与方案参数。
Q7. 下列哪项属于正确理解“同态性质”的描述?
- A.先加密再计算等于先计算再加密← 正确答案
- B.密文可以脱离密钥任意还原
- C.同态加密不需要考虑安全强度
- D.密文运算结果必然变成明文
答案:A。同态性质的本质是 \(E(m_1) \oplus E(m_2) = E(m_1 \oplus m_2)\),即“运算与加密可交换顺序”。其他选项要么违背密码学常识,要么混淆了密文与明文。
Q8. 重线性化(Relinearization)的主要作用是什么?
- A.压缩密文并控制噪声增长← 正确答案
- B.显著提升加密算法速度
- C.直接把密文转换成明文
- D.更换底层加密方案
答案:A。密文乘法会让密文分量从 2 个膨胀到 3 个,噪声也急剧放大。重线性化借助重线性化密钥把 3 分量压回 2 个,如同换一副新手套。它不负责加解密速度,也不改变方案类型。
Q9. 关于同态加密的噪声预算,下列说法正确的是?
- A.噪声预算用尽后解密必然失败← 正确答案
- B.加法完全不引入任何噪声
- C.噪声预算越多计算越慢
- D.噪声预算只影响安全性
答案:A。噪声预算耗尽意味着噪声越过系数模一半的阈值,解密必失败。加法也会引入少量噪声,噪声预算同时影响正确性与性能,“只影响安全性”的说法不成立。
Q10. 使用 SEAL 库进行密文计算的典型流程包括哪些步骤?
- A.设置加密参数与上下文← 正确答案
- B.生成公钥私钥密钥对← 正确答案
- C.用加密器把明文转为密文← 正确答案
- D.用明文计算器替换密文计算
答案:ABC。完整流程是“参数设置 → 密钥生成 → 加密 → 密文求值 → 解密”。D 所说的“明文计算器替换密文”完全违背同态加密的初衷——全程都不该解密更不该碰明文。
Q11. 关于同态加密的噪声管理,下面哪些说法正确?
- A.乘法运算会显著放大噪声← 正确答案
- B.加法运算也会引入少量噪声← 正确答案
- C.增大参数后噪声可以完全消除
- D.噪声超过阈值将无法正确解密← 正确答案
答案:ABD。噪声无法完全消除,只能通过参数与算法设计“控制预算”。乘法放大噪声最剧烈,加法引入少量噪声,一旦超过阈值解密即失败。C 把“控制”偷换成了“消除”,是典型误区。
Q12. 下列哪些参数是 SEAL 中决定性能与安全的关键设置?
- A.多项式模次数 poly_modulus_degree← 正确答案
- B.系数模 coeff_modulus← 正确答案
- C.明文模量 plain_modulus← 正确答案
- D.图形渲染分辨率 resolution
答案:ABC。多项式模次数 \(N\) 决定安全强度与运算规模,系数模 \(q\) 决定噪声容纳上限,明文模量 \(t\) 决定可表达数据范围,三者共同决定性能。渲染分辨率是同态加密无关的图形学参数,纯属干扰项。