正文
有意思的是,Bob(乃至其他所有人)都能用 Alice 的公钥来检查这个签名是不是 Alice 生成的(译者注:验证需要被签名的数据)。检验完了 Bob 就知道,到底是不是 Alice 用自己的私钥(以及相应的数据片)生成了这条签名。而私钥可以签名任何数据,也就是说数据可以是 Alice 和 Bob 的任何表态和请求。举个例子,签名可以意味着 Alice 同意该段数据表示的意思(就像 Alice 给合同手写了一个签名一样)。
而盲签名则使这一切更进一步。一开始,Bob 先生成一个随机数,称为 “nonce”,然后拿这个随机数和一段初始数据一起运行特定的数学运算,得出一段乱序的数据片。这个乱序的数据片使其看起来与其它的随机字符串无异。然后 Bob 拿这段乱序数据给 Alice 签名。Alice 没法断定 Bob 的初始数据是什么样的,所以她是 “盲目的”。Alice 签名运算的结果就是 “盲签名”。
盲签名的特殊性在于,这条签名不仅关联着 Alice 的密钥(任何数字签名都有这样的特征)和乱序数据片。它也关联着那段初始的、没有被混淆过的数据。如果能获得那段原始数据,那么任何人仅需使用 Alice 的公钥,就能检查 Alice 是否签名了那段原始数据的一个乱序版本 —— 当然也包括 Alice 自己。
ECASH
盲签名就是 Chaum 用来创造数字货币系统的关键工具。
要理解这些,你要先把上文示例中的 Alice 当成一个银行:Alice Bank。这是一家普通银行,就像我们现实中的一样,客户们在银行里有专门的账户以及存款。
假设 Alice 银行有四个客户:Bob、Carol、Dan 和 Erin。在假设 Bob 想从 Carol 手上买些东西。
首先,Bob 要向 Alice 银行请求 “取款”(一般来说 Bob 当然要在事先取到钱,但你先不要管这些细节)。取款的时候,Bob 自己创建一些 “电子钞票”,形式是一串独一无二的数字,称作 “序列号”。此外,他还要像上面的例子那样,生成这些钞票的乱序版本,然后把这些乱序支票发给 Alice 银行。
收到 Bob 的乱序钞票后,Alice 银行盲签名每一条乱序数据,然后把这些签名发回给 Bob。每签发一条乱序钞票,Alice 银行就从 Bob 的银行账户扣除 1 块钱。
现在,因为 Alice 银行盲签了这些乱序钞票,她的签名已经与初始的电子钞票关联了起来。所以 Bob 现在可以使用这些初始的、没有经过混淆的钞票给 Carol 支付了。他只需把这些数据发送给 Carol 即可。
Carol 收到这些电子钞票后,转发给 Alice 银行。Alice 可以检查自己是否签名过这些钞票,这也是靠盲签名完成的事:它们都跟她的私钥有关联。Alice 银行也顺带检查同样的钞票(序列号)是否已由他人使用过(自己是否遭遇了多重支付)。
钞票检验完成后,Alice 银行就给 Carol 的账户添加等量的金额,并告知 Carol。经过银行的确认后,Carol 也知道了 Bob 所支付的是有效的钞票,可以放心地发货了。
- eCash 背后的基本原理。来源:faculty.bus.olemiss.edu/ -
最关键的是,Alice 银行只有在 Carol 要存入这些数字钞票时才会知道未经混淆的钞票数据!因此,Alice 银行根本不知道这些钞票是 Bob 的。理论上,也完全有可能是 Dan 或者 Erin 的!