瓜皮SVS 1.0.6

瓜皮SVS 1.0.6

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2017年8月
SwiftSwift 版本3.0
SPM支持 SPM

Fabio Tacke 维护。



 
依赖
BigInt>= 0
CryptoSwift>= 0
 

瓜皮SVS 1.0.6

瓜皮SVS - 公共可验证秘密共享

该库在 Swift 中实现了瓜皮SVS 方案。算法基于 Berry Schoenmakers 的《一个简单的公共可验证秘密共享方案及其在电子投票中的应用》。

什么是瓜皮SVS?

秘密共享意味着经销商可以将一个秘密分成一组参与者的部分,只有当合作地加入他们的秘密部分时才能重构秘密。该库还实现了门限密码学,以便经销商可以决定是否所有接收到的参与者需要合作,或者是否一个较小的参与者子组足以重构秘密。

除了直接的秘密共享方案外,瓜皮SVS 以以下方式增加了可验证性:将秘密分割后的每个部分分别用接收者的公钥加密。经销商发布所有加密份额以及一个非交互式零知识证明,允许每个人(而不仅仅是接收参与者)验证解密的份额确实可以用来重构秘密。参与者随后解密他们所有的份额,并交换它们以及另一个非交互式零知识证明,允许接收参与者验证份额确实是解密的结果。

因此,瓜皮SVS 可以在参与者之间共享一个秘密,以便任何参与方都可以公平地重构秘密,或者收到假份额的参与者可以识别恶意方。

安装

Swift 包管理器

.Package(url: "https://github.com/FabioTacke/PubliclyVerifiableSecretSharing.git", majorVersion: 1)

使用方法

本节将指导您了解在瓜皮SVS 方案中采用的基本步骤。

设置

首先,如果需要,我们将我们的秘密信息转换为数值。在创建经销商时,还会创建一个名为瓜皮SVS 的实例,该实例保存所有参与者所需的全局参数。

import PVSS
import BigInt

let secretMessage = "Correct horse battery staple."
let secret = BigUInt(secretMessage.data(using: .utf8)!)

// Create PVSS Instance.
let dealer = Participant()

// Participants p1, p2 and p3.
let p1 = Participant(pvssInstance: dealer.pvssInstance)
let p2 = Participant(pvssInstance: dealer.pvssInstance)
let p3 = Participant(pvssInstance: dealer.pvssInstance)

分发与验证

经销商将密钥分割成份额,对它们进行加密并创建证明,以便每个人都可以验证这些份额(一旦解密)可以用来重构密钥。阈值确定用于重构所需的份额数量。然后将加密份额和证明打包在一起。

// Dealer that shares the secret among p1, p2 and p3.
let distributionBundle = dealer.distribute(secret: secret, publicKeys: [p1.publicKey, p2.publicKey, p3.publicKey], threshold: 3)

// p1 verifies distribution bundle containing encryted shares and proof. [p2 and p3 do this as well.]
assert(p1.pvssInstance.verify(distributionBundle: distributionBundle))

交换与验证

参与者从分配包中提取自己的份额并对其进行解密。他们将与一个证明一起打包,以便接收者可以验证该份额确实为解密的结果。

// p1 extracts the share. [p2 and p3 do this as well.]
let s1 = p1.extractShare(distributionBundle: distributionBundle, privateKey: p1.privateKey)!

// p1, p2 and p3 exchange their shares.
// ...

// p1 verifies the share received from p2. [In fact, everybody verifies every received share.]
assert(p1.pvssInstance.verify(shareBundle: s2, encryptedShare: distributionBundle.shares[p2.publicKey]!))

重构

一旦参与者收集到至少threshold份份额,就可以重构密钥。

// p1 [as well as p2 and p3] can now reconstruct the secret.
let shareBundles = [s1, s2, s3]
let r1 = p1.pvssInstance.reconstruct(shareBundles: shareBundles, distributionBundle: distributionBundle)!

print(String(data: r1.serialize(), encoding: .utf8)!)
// Correct horse battery staple.