**隐私增强技术(PETs)**指在不牺牲可验证性的前提下限制信息泄露的密码学工具族:按防护目标分为隐藏身份(混币、环签名、隐形地址)、隐藏内容(机密交易、同态加密、安全多方计算)、隐藏知识本身(零知识证明)与物理层隔离(可信执行环境)。本节建立仪器谱系与选型矩阵,把成本账摊开,为后两节的深拆打底。
上一节的分析流水线证明了一件事:光靠"不写名字"挡不住任何观察者。检验科因此备了满满一柜仪器,按"藏什么"分层摆放。第一层藏身份:观察者知道有交易发生,但认不出谁是谁——混币池打散控制权历史,环签名把真实签名者藏进人群,隐形地址让收款方每次收款都换新面孔。第二层藏内容:交易发生、身份可辨,但金额与资产类别加密——机密交易用承诺方案隐藏金额且保持可验证,同态加密允许密文上直接计算,安全多方计算让多方合力算结果而互不见底牌。第三层最激进,藏知识本身:零知识证明让你证明"我有权做这件事"而不透露任何支撑事实——它不是给信息上锁,是让验证与知晓分离。第四层在物理层动手:可信执行环境把计算关进硬件隔离区,观察者(包括操作系统)只见输出不见过程。
四层仪器的通用设计哲学值得先记下:隐私不是加密一切,而是精确控制"谁在什么条件下能看到什么"。全加密的账本无法被矿工验证,等于放弃了区块链的立身之本;PETs 的全部巧思在于"遮住内容、保留证明力"。
混币与隐私池:多笔输入打散重分配输出,切断输入输出对应关系。原理朴素,匿名性依赖参与者多样性——池子小、时间模式一致则形同虚设。环签名:一组公钥共同构成"环",签名可被验证出自环中某人、但无法定位是谁。匿名集等于环成员数,代价是每笔交易都要拖着"人群"一起验。隐形地址:付款方为每笔付款派生一次性收款地址,只有收款方能认领——收款关系对外人不可见。机密交易:金额以密码学承诺的形式上链,验证者能确认"输入承诺之和等于输出承诺之和"却读不出金额——账平的证明与金额的保密并存。同态加密:密文加法或乘法的结果解密后与明文运算一致,链下托管数据、链上只验证明成为可能。安全多方计算:多方各持秘密输入,合力计算约定函数而互不泄露输入——联盟风控与联合统计的主力。零知识证明:证明某陈述为真而不泄露任何额外信息,5.4 节整个交给它。可信执行环境:硬件隔离区内的计算带远程证明,快但把信任押给芯片厂商。差分隐私:在统计发布前注入校准噪声,使个体存在与否不影响输出分布——链上数据分析与公开报表的护栏。
工具选型从威胁模型出发。把上节的攻击者三问(这是同一个人吗、钱从哪来、这笔交易特殊吗)扩展成一张问句到仪器的路由表:
def select_pet(threat_model): """按威胁问句路由到仪器组合""" picks = [] q = threat_model if q.linkability: # "这两笔是同一人吗" if q.trust_third_party: picks.append("混币池(简单,需信任运营)") else: picks.append("环签名 + 隐形地址(自trustless)") if q.amount_visible: # "金额多少能读吗" picks.append("机密交易(Pedersen 承诺 + 区间证明)") if q.data_hosted_offchain: # "托管方能读我的数据吗" picks.append("同态加密 或 安全多方计算") if q.proof_needed: # "既要证明 又不能亮底牌" picks.append("零知识证明(zk-SNARK 或 zk-STARK)") if q.statistical_release: # "公开发布统计会泄露个体吗" picks.append("差分隐私(预算 eps 控制)") if q.hardware_ok: # "接受把信任押给硬件厂商吗" picks.append("可信执行环境(高性能兜底)") return picks or ["无对应威胁 -> 先写威胁模型,再谈工具"] print(select_pet({"linkability": True, "trust_third_party": False, "amount_visible": True, "proof_needed": False, "data_hosted_offchain": False, "statistical_release": False, "hardware_ok": False})) # -> ['环签名 + 隐形地址(自trustless)', '机密交易(Pedersen 承诺 + 区间证明)']
路由表的第二行值得展开:机密交易的"账平可验"靠的是承诺方案的代数性质——承诺对加法封闭(两个金额承诺的乘积可"相加"成总承诺),配合一个证明每个金额落在合法区间的零知识小证明。这也是 PETs 谱系的普遍现象:主力仪器几乎都以零知识证明为最后一块拼图,5.4 节的地位由此而来。
隐私不是免费的,价签分四种货币。
| 仪器 | 计算开销 | 数据开销 | 信任假设 | 主要失效姿势 |
|---|---|---|---|---|
| 混币池 | 低 | 低 | 运营方不记日志 | 参与者少、时间模式暴露 |
| 环签名 | 中 | 每笔拖全环公钥 | 无 | 环成员选择不当缩小匿名集 |
| 隐形地址 | 低 | 低 | 无 | 付款方私钥泄露历史全暴露 |
| 机密交易 | 中高 | 证明约千字节级 | 无 | 实现漏洞导致金额伪造 |
| 同态加密 | 高(近似全同态极高) | 密文膨胀 | 密钥管理 | 侧信道与参数老化 |
| 安全多方计算 | 高(随方数增长) | 通信膨胀 | 多数方不合谋 | 合谋阈值失守 |
| 零知识证明 | 证明生成高、验证低 | 证明数百字节级 | 视方案:可信设置有无 | 电路漏洞、参数废料 |
| 可信执行环境 | 极低 | 极低 | 芯片厂商与实现 | 侧信道、固件漏洞 |
| 差分隐私 | 低 | 低 | 噪声参数诚实 | 预算耗尽后的累积泄露 |
用一段代码把"匿名集收益递减"与"成本递增"的交叉点可视化成数字:
def anonymity_vs_cost(ring_size: int): """环签名:匿名集收益对数增长,成本线性增长""" import math # 猜中真实签名者的概率 = 1/环大小;信息论下限按 log2 衡量 bits_of_privacy = math.log2(ring_size) tx_size_kb = 0.3 + ring_size * 0.1 # 每个环成员带公钥与映像数据 verify_ms = 2 + ring_size * 0.7 # 验签时间随环线性增长 return bits_of_privacy, tx_size_kb, verify_ms for n in (4, 8, 16, 32, 64, 128): bits, kb, ms = anonymity_vs_cost(n) print(f"环大小 {n:>3}: 隐私 {bits:4.1f} 比特 | 交易 {kb:5.1f} KB | 验证 {ms:5.1f} ms")
环从四到八,隐私比特翻倍、体积也近乎翻倍;从六十四到一百二十八,同样的翻倍要再付出一倍体积——隐私的边际收益对数递减,边际成本线性递增,每个隐私链的默认参数都是这条曲线上的一个选点,5.6 节看两条真实产线怎么选。
⚠️ 集成 PETs 的三条现场纪律:其一,组合 ≠ 叠加,匿名性的短板永远由最弱的仪器决定(环签名环环相扣、金额却明文,等于匿名了身份泄露了行为);其二,"信任假设"列比"开销"列更常被低估,可信设置与运营方日志是历史事故高发地;其三,隐私功能的可用性决定其安全——确认要等半小时的隐私交易会逼用户放弃隐私选项,可用性即安全性在检验科同样成立。
💡 判词:第一层藏身份,第二层藏内容,第三层藏知识,第四层藏过程;选仪器先问攻击者会问哪句。
谱系级的通用弱点有三。元数据不归密码学管:交易时间、网络来源、金额模式、与锚点的接触,都在密码学承诺的射程之外——差分隐私与流量混淆是补丁不是根治。参数与实现是永恒软肋:正确性证明覆盖数学,覆盖不了工程(随机数劣化、侧信道、电路写错)。匿名集是社会性资产:再强的密码学,也保不住一个没人用的隐私池——匿名的强度与你混入的人群同宽。带着这三条通用弱点,下一节打开柜中最重的仪器:零知识证明,看它如何把"验证与知晓分离"做到极致。