安全声明

A bug related to transaction priority handling may allow an attacker to crash Zcash nodes (Denial of Service) via a specially crafted transaction. A fix is implemented in zcashd release 1.0.8-1.
Please see the official announcement for more details and update your Zcash node to 1.0.8-1.

语种

如何安全生成SNARK参数

Zooko Wilcox | Feb 29, 2016

想要创建完全安全可靠的开放式金融体系还面临着很多加密上的挑战。

在Zcash开发过程中我们目前的首要任务是安全地生成“SNARK公共参数”。

问题是什么?

用最简单的方法生成“SNARK公共参数”也会生成一种加密的“有毒废物”,这使得Zcash成了可伪造的产品。以下是我们防止造假的计划。

SNARKs——零知识证明的一种非常有效的形式——是Zcash的加密构件。它们允许矿工在无需向矿工公开交易内容私有信息的情况下,验证交易和拒绝无效交易。

SNARKs需要“公共参数”才行。SNARK公共参数是系统中所有参与者都知道的有独特加密结构的数字。从一开始它们就被拷进协议和软件。

构建SNARK公共参数最明显的方法就是让某人生成一个公钥/私钥对,类似于ECDSA密钥对[*]_,然后销毁私钥。

问题就在于那私钥。谁拷贝了它谁就可以用它来制造假币。(然而,它不能侵犯任何用户的隐私—在这里交易的私密性不会受到威胁。)

目前我们在Zcash开发过程中的重中之重是减小这种威胁。我们称该私钥材料为“有毒废物副产品”—它是公共参数生成中产生的多余副产品,我们需要尽可能安全地去控制和销毁它。

对此我们能做些什么?

我们已经想出了一个安全的多方计算,多人各自生成公钥/私钥对“碎片”,然后他们各自摧毁他们的有毒废物私钥碎片,之后他们都把他们的公钥碎片汇集起来以形成SNARK公共参数。如果该过程奏效—即,如果参与者中至少有一个成功摧毁了他们的私钥碎片---那么有毒废物副产品根本不会存在。

我们就这个过程背后的 密码学写了一篇论文 发表于2015IEEE“奥克兰”安全和隐私会议。

我们目前选用了一批业界资深人士,致力于研究该安全多方计算执行过程中的工程和操作细节。同时,我们也在探索除了Zcash之外是否有其他同样需要公共参数的公司在应用SNARKs。因为我们可以像为Zcash一样同时为这些其他应用生成公共参数。

我们还可以做些什么?

那么,这是否解决了问题?我们认为该解决方案非常好,可以继续探索。如果奏效,它可以完全消除有毒废物私钥,任何敌人想要击败它将会是异常苦难的。

不幸的是,没有办法可以确定,事后它是否能真正奏效。总会有这样的担忧,N个参与者中全部N个人可能已暗中勾结一起分享自己的私钥碎片,或者N个参与者中全部N个人的电脑可能已被敌人攻击,他们偷走了所有的私钥碎片。

因此,我们也在探索长期方法---如果能够奏效---可以进一步降低这种风险和其他类似的风险。

  • 也许我们可以利用现代的“ 可信执行环境 ”,如英特尔SGX和ARM TrustZone,这样即使参与者---或者参与者使用的受到攻击的电脑----试着提取自己的私钥碎片,他们最终无法成功。可能我们可以让一些参与者使用英特尔SGX,其他人使用ARM TrustZone,其他人两者都不使用,这样即使英特尔SGX和ARM TrustZone都被攻击了,攻击者仍然无法创建有毒废物副产品,因为其他参与者中至少有一个成功摧毁了他们的碎片。
  • 可能会有一种方法可以用新参与者新生成的公钥碎片来反复扩展SNARK公共参数,这样攻击者就会失败,除非他们不仅仅利用了所有原参与者,还利用了所有新参与者。
  • 可能会有一种方法来审计Zcash货币基数的大小,不需要攻击任何使用者的隐私。用这种方法,人们至少可以说“我们不能100%确定有毒废物私钥没有被一些人偷走,但至少可以说他们还没有用它来制造假币。”
  • 可能会有一种SNARK新形式,其公共参数与任何有毒废物私钥无关。没有人可以确定这样的事情是否可能发生,但是科学家们 ,包括一些来自我们团队的,正继续`积极探讨`_ 什么样的证明系统界限是可能的。

底线

有一种“加密有毒废物”,如果有人创建并利用了它,会使攻击者有机会制造假币(尽管它并不允许他们侵犯任何人的隐私)。我们的阻止计划是使用一个安全的多方计算,一组著名的参与者每一个人都可以以这样的方式做出自己的贡献,如果他们中的任何一人成功摧毁了他们的碎片,那么加密有毒废物就不会生成。我们也正致力于探索其他有潜力的、长期的防御以抵制类似这样的风险。

[*]在这里我完全简单化了。SNARK公共参数不只是一个ECDSA公钥---他们更像是一百万ECDSA公钥组,每一个都包含了SNARK电路特定线的编码。但对于这篇博文来说,这一点也无关紧要了。