5.5 同态加密、环签名与混币


5.5 同态加密、环签名与混币

同态加密支持在密文上直接运算并保持代数关系,环签名让签名隐没于一组公钥构成的环中,混币以批量打散切断输入输出的对应关系。三者分别应对"内容可见性""发送者身份""资金流向"三种暴露,是隐私链的日常主力。本节实现同态加法的最小模型与一个结构完整的环签名,并把混币的博弈论摊开。

密码学展柜里的三件日常工具

零知识证明是展柜中央的重器,日常生产则靠三件顺手的工具。想象托管云上要做联合统计:数据不想给云端看,同态加密让云端在密文上把统计做完,回传的仍是密文。想象付款时不想暴露"是我付的":环签名把你的签名混进一串别人的公钥里,验证者确信"环内某人签的",指认无门。想象一笔旧账想花得不留痕迹:混币把你的币与他人的币一起熔了重铸,输出与输入的对应关系在概率上被打散。三件工具各管一段:同态管"算得着看不见",环签名管"验得着指不出",混币管"花得着追不回"。

图 5-5 环签名:把真实签名者藏进人群

图 5-5 环签名:把真实签名者藏进人群

同态加密:密文上的算盘

加法同态的最小模型可以徒手搭:加密即"加掩码",解密即"去掩码",密文相加恰好等于明文相加后再加掩码——云端全程只见乱码,统计照做不误:

import random class AdditiveHE: """教学版加法同态:真实系统用佩莱系数或格上的噪声方案""" def __init__(self, modulus=10**9 + 7): self.M = modulus def keygen(self): return random.randrange(1, self.M) # 私有掩码 def enc(self, k, m): return (m + k) % self.M def dec(self, k, c): return (c - k) % self.M def add(self, c1, c2): # 密文直接相加 return (c1 + c2) % self.M he = AdditiveHE() k = he.keygen() salaries = [12000, 18500, 9800, 24500] # 明文不出本地 cipher = [he.enc(k, s) for s in salaries] # 上传密文 # 云端只看到 cipher,做统计: total_c = cipher[0] for c in cipher[1:]: total_c = he.add(total_c, c) avg_c = None # 除法需更多结构,先看总和 print("云端持有的密文:", [c % 1000 for c in cipher], "...(对云端全是乱码)") print("密文总和回传解密:", he.dec(k, total_c), "= 明文总和", sum(salaries))

密文加法保持代数结构,是"同态"二字的全部含义。真实世界的层级:只支持加法的方案成熟高效(统计聚合、私密求和);近似全同态方案可做任意电路但每步引入噪声、参数随深度膨胀;全同态是圣杯,性能至今仍是主要门槛——链上场景的常规姿势是"链下同态计算、链上零知识验算",两件工具分工而非互斥。

环签名:上机实现一个真结构

环签名的巧妙在于"占位与闭环":非签名者的环节用随机数占位,签名者只解自己那一环,让哈希链条首尾闭合。下面的实现保留了真实协议的完整结构(教学参数):

import hashlib, random p, g = 3229, 229 # 教学用小域 ORDER = (p - 1) // 2 # 取素数阶子群(教学简化) def H(*args) -> int: data = "|".join(str(a) for a in args).encode() return int.from_bytes(hashlib.sha256(data).digest()[:6], "big") class RingMember: def __init__(self): self.x = random.randrange(1, ORDER) # 私钥 self.y = pow(g, self.x, p) # 公钥 def ring_sign(msg, members, signer_idx): n = len(members) L = [m.y for m in members] # 环:公钥列表 r = [0] * n a = random.randrange(1, ORDER) # 签名者的随机起点 c = [0] * n c_next = H(L, msg, pow(g, a, p)) i = (signer_idx + 1) % n while i != signer_idx: # 给非签名者占位 r[i] = random.randrange(1, ORDER) c[i] = c_next c_next = H(L, msg, pow(g, r[i], p) * pow(members[i].y, c[i], p) % p) i = (i + 1) % n c[signer_idx] = c_next # 闭环节:解出签名者的 r,使链条恰好回到起点 a r[signer_idx] = (a - c[signer_idx] * members[signer_idx].x) % ORDER return c[0], r def ring_verify(msg, members, sig): c0, r = sig L = [m.y for m in members] c = c0 for i in range(len(members)): c = H(L, msg, pow(g, r[i], p) * pow(members[i].y, c, p) % p) return c == c0 # 链条闭合 -> 签名有效 random.seed(5) ring = [RingMember() for _ in range(6)] sig = ring_sign("付款 5 个单位的隐藏身份版", ring, signer_idx=2) print("环验证:", ring_verify("付款 5 个单位的隐藏身份版", ring, sig)) print("改消息验证:", ring_verify("被篡改的消息", ring, sig)) # 重复签名同一消息会暴露同一签名者(密钥映像问题), # 真实产线为每把私钥派生一次性映像防止双花与关联

跑通后再看验证函数:它从头到尾只做"上一环节哈希推出下一环节"的接力,最后检查回到起点——闭合性证明了"环中确实有一人持私钥参与了计算",但每个环节的数值在数学上互相纠缠,无法区分谁是真的解环者。真实隐私链还会为每把私钥派生"密钥映像"随签名公布:同一把私钥签两次,映像相同,双花即刻被发现——匿名与防重放在此精巧地共存。

混币:一场多方博弈

混币的机制一句话讲完:多人把等额币投入一个池,再各自从池中领取等额新币——输入输出的对应被池子打散。它的强度完全由博弈结构决定,写成代码推演参与者构成对匿名性的影响:

import random def mix_pool(participants, honest_ratio, rounds=3): """模拟混币池:观察者成功配对输入输出的概率""" n = len(participants) honest = sum(1 for _ in participants if random.random() < honest_ratio) # 诚实者随机领取输出;被收买的"蜜罐"参与者会私下记录自己的输出 # 观察者可用蜜罐输出排除法,把剩余配对问题缩小 remaining = n - int(n * (1 - honest_ratio)) # 观察者无法利用的输出数 success = 1 / remaining if remaining > 1 else 1.0 return success random.seed(8) for ratio in (0.9, 0.6, 0.3): p = mix_pool(list(range(20)), honest_ratio=ratio) print(f"诚实参与者比例 {ratio:.0%} -> 观察者配对成功率约 {p:.0%}")

三行输出讲完混币的风险学:诚实比例高时配对近乎瞎猜;蜜罐(被分析公司收买的参与者)渗入后,排除法让配对成功率飙升。混币的强度因此不是技术参数而是社会参数——谁在池里,比池子怎么加密更重要。去中心化混币协议的改进思路(固定面额、匿名集统计公示、防蜜罐的成员资格证明)都在加固这个社会参数。

⚠️ 集成三件工具的两条现场纪律:其一,环签名与混币默认不隐藏金额,金额明文会让时间-数额交叉分析绕过身份保护——真实产线必须配机密交易(金额盲化)才是完整拼图,下一节的 Monero 正是这个组合;其二,同态加密的参数选择与噪声管理是专业活,教学级模型只能演示结构,生产必须用久经审计的库与标准参数集。

💡 判词:同态管"看不着算得着",环签名管"验得着指不出",混币管"追不着配不上"——三件工具凑齐,才够到隐私链的门槛配置。

攻防边界:小工具的失效清单

同态加密怕噪声失控与侧信道,环签名怕环成员被操纵(攻击者把自己的公钥塞满环,真实匿名集瞬间缩水到一),混币怕蜜罐与时间模式(固定时间入池的"规律党"自己给自己画了靶心)。三件工具共同的软肋则是上一节说过的元数据:网络层时间、交易频率、金额尾数——密码学把内容藏好之后,行为本身的影子还留在地上。下一节把全部工具(含零知识重器)装上两条真实产线:Zcash 的屏蔽池与 Monero 的默认全隐私,看工程组合拳与参数选择的真实教训。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U