作者:Nick Szabo

来源:https://nakamotoinstitute.org/library/contracts-with-bearer/

本文为 Nick Szabo 对 “盲签名” 技术的讨论,首次出版于 1997 年。在该文中,Nick Szabo 已经意识到了盲签名的潜力:它不仅能够封装电子现金,还能封装各种各样的计算机资源,进而实现 “不记名的合约”。Nick 在文中着重讨论了为实现不可追踪的交易,应当搭配哪些技术(比如通信加密);需要的技术如何因为被转让的权利的特性而有所不同。

不记名的证书

“电子不记名证书” 是由这位作者 1 提出的一个宽泛的术语,结合了至少两种新兴技术:“电子现金(digital cash)” 和 “分布式系统(distributed capabilities)”。我会先介绍 Chaumian 协议以及它的创新隐私特性。然后,在讨论 通用权利 vs. 具体权利 的章节,我会讨论这个想法如何映射到分布式系统的世界中。我将电子现金的术语从 “电子现金” 改成了 “不记名证书” 或者 “token”,将 “铸币厂” 改成了 “发行者” 或者 “转账代理”,等等,以反映 Chuamian 协议通用化的能力。Chaumian 不记名证书实现了标准化的可转让权利,无需将权利绑定在持有人的身份之上。每一种类的合约(比如说,电子现金 “钱币” 的每一种面额)都对应着一种电子签名(译者注:应指一个公钥,而非一种签名算法),就像每一次发行联邦储备券和股票证书的都对应着一个特定的模板一样。

在最直接形式的 Chaumian 协议中,发行者和转账代理 —— 出于我们的目的,假设为同一实体,虽然可以轻易地解除绑定 —— 创建一个序列号(实际上是一个很大的、无法预测的随机数,而不是按顺序形成的),并且将它添加到一个已发行证书的列表中。在清偿一笔转账(即,赎回这个证书)时,转账代理则通过检查签名来辨识不记名合约的类型、验证自己是否制作过这个合约,然后通过在该类合约的已发行证书列表上搜索、确保这个序列号在列表上,最后移除这个序列号。或者,发行者可以让请求人来制作序列号,然后,在清偿的时候,检查签名并将数字放在一个已清偿证书的列表中。电子签名保证了,这种证书实际上就是特殊的不记名合约,而序列号保证了同一个合约实例最多只会清偿(或者说赎回)一次。在这种简单版本中,转账代理可以将所有转账的转让方和受让方都关联起来。为了实现钱币和实体不记名证书的隐私性特征,我们需要加入不可关联的特性。

盲签名

来看自 “ e=mc2 ”问世以来最简单的等式:

gSf(m) = S(m)

S 是一种电子签名。f 是盲化函数(blinding function),而 g 是一个解盲函数。盲化函数通常基于一个称为 “盲化因子” 的秘密随机数。m 是另一个随机数,一个独一无二的标识符,可以(比如说)索引一些对象的一个实例。

这背后的想法非常聪明,但非常简单。可能反直觉,因为这种非常有用的电子商务原语的最简单的真实世界类比,听起来比没用还要糟糕:Alice 可以让 Carol 签名一张空白支票!以下是怎么做到的:

  1. Alice 生成 m 并盲化它。“盲化” 就是对它运行一次性加密(one-time-pad encryption),得到 f(m) 。Alice 把 f(m) 发给 Carol 。这就像把一张纸放在一个信封里面,而 Carol 打不开这个信封、也看不到里面是什么东西。
  2. Carol 签名它,得到:Sf(m) ,然后发回给 Alice 。这就像 Carol 在信封外面签上了名。
  3. Alice 解除盲化:gSf(m) = S(m) 。Carol 也在 Alice 放在信封内的纸上留下了签名!

这个发现背后的天才是密码学大师 David Chaum 。这种天才就闪耀在第三步中:Chaum 发现了,一些电子签名算法可以跟盲化函数 “数学交换”:Alice 可以按相反的顺序解除盲化(原来是先盲化再签名,现在是解除盲化),从而只留下 Carol 的签名。这就像 Alice 在信封里面藏了一张复写纸!

以 RSA 签名为例子,使用公钥 (pq, e) 和私钥 d ,盲签名函数如下(都对 pq 求模):

S(x) = xd

g(x) = xk-1

f(x) = xke

我们可以检查盲签名属性成立:

gSf(m) = (m(ke))d * k-1 = md * k * k -1 = md

也就是私钥 d 对 m 的 RSA 签名。

不可关联的转账

所谓 “辨识(distinguish)”,是一个对手或者第三方跟踪一个人的真名,要么是利用通信缺乏混淆(或混淆太弱),要么是将参与同一笔交易的两个实体(无论是假名、重复使用的地址、账户号、真名)关联起来。在这里讨论 “不可关联性” 时,我们使用后面这个含义。目标是,在使用真名时(比如说,在使用真名账户或者不良的通信通道时)防止第三方将做交易的两个人关联起来。而在使用假名时,目标是尽可能减少往来信息的泄露,以防止独特的行为模式被逐渐捕捉,这些信息可以用来关联假名(包括关联到真名),也可以加强其他攻破隐私性的手段。盲化在权利持有人希望保留以通用权利计价的第三方账户或者公开账户时,特别有用。这种情况下,通信混淆在理论上都不能提供盲化所带来的好处。

除了对抗转账代理,Chaumian 协议的转让人盲化、受让人盲化以及双重盲化协议防止了一方与转账代理勾结、识别对手方的账户和假名。

结合一个使用盲签名的已清偿的证书的清单,以及 “时延混淆效应(delay-mixing effect)”,就可以提供不可关联性。一种标准化合约在一段时间内出现了足够数量的实例,就可以带来混淆效应。在一个证书的发行和清偿之间,许多其他使用相同签名的证书会清偿,因此通过签名将某一次清偿与某一次发行关联起来,是很难做到的。(用户)在混淆效果和暴露在一个 “模板”的盗窃风险之间,存在取舍:(证书特定一次发行的)发行量越小,被盗风险也越小,但可关联性就会加大;发行量越大,被盗风险也增加,但机密性也会更好。

通过序列号,盲签名可以让证书转移不可关联。从转账代理处获得的隐私性可能采取受让人不可关联的形式,也可能是转让人不可关联的形式,或者说 “双重盲化”,就是转让人和受让人都无法被转账代理关联起来,也无法被转账代理和对手方的勾结所攻破。

一次性地址通信混淆,加上放弃从簿记(keeping accounts)中获得任何声誉,理论上也可以带来不可混淆性,但通信混淆效果较差而且非常昂贵。

不记名证书既有 “在线” 品种,在每一次转让中清偿,因此既可验证又可观察;也有 “离线” 品种,可以转让而不清偿,但仅在最终清偿时才可验证,办法是揭晓任何多次转移该对象(也即违反合约的)中间持有者的清算用名。

不可关联性常常也被称为 “匿名性”,但无论账户是发放给真名还是假名、无论转让人和受让人有没有向对方揭晓自己的身份,都跟在联网模式中对抗转账代理的不可关联性没有绝对关联。离线模式需要账户识别(或者至少是一个声誉卓著的 以及/或者 安全的假名):传递一个离线证书两次就会揭晓这个身份。此外,通信通道也可能允许恶意人关联起转让人和受让人,除非他们预先采用了匿名的邮件转发器。在线清偿确实让不设身份验证成为许多类型的交易的交易的合理选择,虽然常见的授信和担保情形常常能从身份验证中受益(甚至要求身份验证)。

在有人尝试再次兑换一个已经清偿的序列号时,我们会面临一个 “故障还是欺诈” 的难题,就像我们之前在复式记账法(double entry bookkeeping)中会遇到的一样。来自 “DigiCash” 的 ecashTM 协议有意利用了这一点以从网络故障中复原。当证书在传输过程中丢失时,转让人并不清楚受让人是否已经收到了这个证书并将他清偿。直接与转账代理二次转让可以消除这种歧义。但只有在线协议能够使用这种办法。在离线协议中,区分故障和欺诈是紧要的问题,但目前还没有非常令人满意的答案。由于意图的主观性,这个问题通常难以解决。

如果有双向的匿名通信、并且使用一次性密钥,而且有完全无账户的清偿,通过盲签名来说先不可关联性就是多余的。但可以实现的技术离这种理想情形还非常遥远,而且这种理想情形必然涉及较长的通信时延,这通常是不能接受的。在真实的不完美通信种,混淆和便宜的盲化 token 可以相得益彰。

得到保护的对象

发行和清算对一种分布式对象的引用的转让,保护了该对象的用法。这样的对象在经济意义上的 “稀缺性” 意味着,就像真实世界里的物件一样,其使用量是有限的。被保护的对象为一种更加接近稀缺物理物件经济的软件经济提供了基础。被保护的对象可以用来让稀缺的物理资源(比如 CPU 时间、网络带宽和响应时间,等等)以及智力劳动的果实选择性排外 —— 只要一个人愿意支付价格、通过互联网来跟这段信息交互,而不是在本地与它交互(参考内容权利管理)。保护让对象以及它们所封装的资源免疫于拒绝服务式攻击(DoS)。不记名证书协议可以用来转让对一种对象的一个特定实例或一组实例的引用,就像它们可以用了转移其它形式的标准化权利一样。

为了实现完整的为服务而支付的交易,我们通常不仅需要电子现金协议;我们还需要一种协议来保证,只要支付了,就能兑换服务,反之亦然。常见的商业系统使用了多种技术来实现这一点,比如带有认证的邮件、面对面交易、信用记录以及会延长信贷的催收机构(collection agencies),等等。我在关于 “智能合约” 的文章中讨论了这些问题。

通用权利 vs. 具体权利

为了讨论 Chaumian 证书与分布式系统之间的映射,就像(比如说)E 编程语言中实现的那样,我引入了一些有区别但部分重叠的术语:广义的 vs. 具体的,排他的 vs. 非排他的,转让代理 vs. 供应商,token vs. “瑞士号码”。

权利可以是广义的,或者具体的。广义的权利对应于一类对象,具体的权利则对应于一个实例。所以,一种具体的权利是用一个瑞士号码(很大的随机数)来实现的。对应于通用权利、被签名的数字,我称之为 “token”。

权利可以是排他的,也可以是非排他的。任何必须被保护的对象,或者最终要分配给一个具体用户的对象,都是 “排他的”。

简单的例子:对一段空间为 1MB 的内存的排他锁定权利,是广义的、排他的。而对具体的地址空间 100-101 的排他锁定权利,是具体的,也是排他的。而在今天下午 12:22 获得两组特定股票的报价的权利,是具体的,也是非排他的。

作出这些区分的主要动机是这些权利的不可关联转让有不同的机制,如下文所述。

出于简单,通用权利全都是 “一次性使用的”:一个 token 的生命从发行开始,然后是一连串的转让,最后是消费。更复杂的生命周期,比如交替转让和消费,要用额外的协议才能实现。

使用一种完美的通信混淆,包括一次性使用的返回地址,并且不设声誉机制,我们是不需要盲化 token 的。然而,通信混淆是昂贵的,而且我们也希望可以选择能够建立声誉的特定公开记录,同时私下转移特定权利。出于这些理由,我们应该允许客户端来盲化 token 转移,同时提供一种通信混淆。

对于排他通用权利的便宜的、不可关联且可验证的转移,要使用盲化 token,必须有大量可以相互交换的通用权利。与非排他的具体权利捆绑在一起的权利,也可以便宜地转移,因为后者(非排他的具体权利)不需要在线清偿。排他性具体权利的不可关联却可验证的转让,需要通过昂贵的通信混淆来实现在线清偿。

还有两种类型的 “受信任第三方(TTP)”:转账代理(TA)和供应商。TA 的操作就像五账户的电子现金铸币厂,负责清偿表示通用权利的 token 的转移。电子现金是一个特别的例子:货币是最广义的权利。

供应商则负责实际持有这项对象,它们可能包含独一无二的状态。供应商发行一个瑞士号码,或者更好的表述是,一项具体权利的带有签名的描述及其瑞士号码。这个签名允许非排他权利的离线验证,在这个供应商具有声誉的时候。TA 则发行对应通用权利的 token 。

Chaum 还开发了其它工具来处理独特的状态 2

我假设 TA 和供应商具有众所周知的、带有声誉的签名。保证供应商、TA 和用户之间转移的正确性的信任因素(或者说声誉),部分留待后文分析。在这里,两个主要目标是,保证用户可以验证自己的权利(包括对抗转让方的排他性),同时保留对抗 TA 和供应商的完整隐私性。这里可能还需要作出其它信任假设,需要进一步明确和分析。

为了实现排他性权利的转移,TA 要保存一个已清偿的(已取消的) token 号的列表。TA 就对应于 Chaumian 在线电子现金协议(见上文)中的 “铸币厂”。一类通用权利就对应于钱币的 “面额”。供应商可能也需要保存未偿还的或者用过的瑞士号码清单,就像一个 E 语言注册表(Registrar)一样。

这里有另一个通用权利(或者可互换对象类)的例子:“一个可查询的 SQL 数据库,占用最多 10 MB 存储空间,并且具有特定的标准响应时间保证。”

TA 智能看到可互换对象的类。供应商和用户看到的是带有独特状态的具体实例,比如填充了独特信息的一个数据库。

供应商的行为类似于 “商店”。它只是 TA 的另一种 token 客户,跟其他客户一样,可以转移和收到 token 。他的特殊角色在于,他负责发行,也就是告诉 TA 有一个新的实例、获得一个新的 token,然后将 token 转移给被赋予新的通用权利的客户。TA 仅在供应商的要求下生成和销毁 token ;否则,所有的 token 转移都会构成一种广义权利的供应量。供应商也负责向保有被承诺的权利的客户交付服务,交付的同时供应商 “存入” 通用的 token、指示 TA 减少 token 的供应量。用电子现金的术语来说,供应商是唯一一个不得不保存一些东西(就像银行账户)的实体。权利持有者有可以保存一个账户,如果它们希望用它来帮助建立声誉的话,或者,他们可以直接使用 TA 来实现无账户的被保护权利的转让。

在发行最初的通用权利 token 使,供应商要随附一个签过名的宣誓书,不论是机器可读的还是人类可读的,以描述这个对象的各个方面(可能是非排他的,也可能是特殊的),以及该实例的瑞士号码以及让该通用权利生效的公钥。比如说,这个宣誓书可能会说 “这是一个数据库,包含了这两打列出的股票在周一下午 12:22 的报价”,但自身并不包含这些报价。通常,这样的描述跟通用排他权利绑定时更有价值,比如获得快速响应时间的权利。具体权利也可以用特殊的方式来表达通用权利,只要这些表达不会用来定义排他性权利即可。通用权利让 TA 可以向用户保证排他性、为供应商的资源提供保护,同时,具体权利可以按照任意可取的程度来表达特殊状态。供应商必须准备好服务他已经发行的任何具体承诺,这要这些承诺伴有妥当保护的通用 token 。

这种办法可以组合具体权利和通用权利、将他们捆绑转让、同时带有在不同 TA 处清偿的排他性通用原子,让任意复杂的权利包(指向带有任意特殊状态的对象),都可以无法关联地转让。各种各样的衍生品和组合都是有可能的。唯一的限制在于,获得对具体排他性资源的权利,必须要么推迟到消费阶段,要么需要在在线清偿模式下通过昂贵的通信混淆来转移。

如果供应商希望保证对一项具体权利的排他性,转让似乎就要求供应商与受让人之间开展昂贵的通信混淆,而不能只转移盲化 token 。比如说,“周日早上 5 点至 9 的 Deep Space Satation 60 号”,或者 “现在在 autoxec.bat 上的一把锁”,都要求对一项具体权利的排他性,因此,似乎要求通信混淆来实现不可关联的转账。另一方面,“5 月份在 DSS-60 里面待 1 个小时”,以及 “某个时刻锁定 autoexec.bat 的权利” 则是通用的,可以使用便宜得多的盲化 token 来隐秘地转移,只要在这个 token 的发行与消费之间、被转移的这类通用权利的其它 token 数量足够多。

客户跟 TA 可以不使用通信混淆。但跟供应商就需要通信混淆。如果 token 的最初和最后一个持有者都没有这样作,供应商就可以将他们关联起来。如果仅仅是最后一个持有者没有这么做,那么供应商就能定位他们是资源的实际用户。因此,想要获得完全隐私性,通用权利的转让是便宜的,非排他权利的转让也是便宜的,而具体的排他权利的转让、实际使用被保护的导向,都需要昂贵的通信混淆。

致谢

感谢 David Chaum、Mark Miller、Bill Frantz、Norm Hardy 以及许多人给予我关于这些话题的有价值简介。

参考文献

1. 第一篇公开指向这些想法的文献可以在 这里这里 找到。我也在这一时期的私人通信中使用这些观念,用词是 “电子的不记名工具”、“电子不记名证书”、“稀缺对象” 以及 “被保护的对象”。电子不记名证书的想法,作为一种用于金融行业的严肃提议,因为 Bob Hettinga,已经流行起来,还带起了许多有趣的想法。

2. David Chuam, Online Cash Checks

3. 用于不可追踪支付的盲签名”,D. Chaum,Advances in Cryptology Proceedings of Crypto 82,D. Chaum, R.L. Rivest, & A.T. Sherman (Eds.), Plenum, pp. 199-203.

4. E 分布式对象语言