Threshold signatures,
multisignatures
& aggregate signatures
Intuition and definitions
1
Alin Tomescu
@alinush407
Aptos Labs
Normal signature schemes
Rivest, Shamir, Adleman '78
2
σ = Sign(m, sk)
Verify(σ, m, pk)
sk
message m
(e.g., Bitcoin TXN)
API for a normal signature scheme
KeyGen(1k) → (sk, pk)
Generates a key-pair for a signer: a secret key and its corresponding public key
(k denotes a security parameter; e.g., k = 128 bits)
Sign(m, sk) → σ
Produces a signature σ on m
Verify(σ, m, pk) → 0/1
Verifies the signature σ on m under the public key pk of the signer
3
Threshold signature (TS) schemes
Desmedt '87
4
σ1 = Sign(m, sk1)
sk
sk5
sk4
sk3
sk2
sk1
e.g., "3 out of 5" secret sharing
Signature share
σ3= Sign(m, sk3)
Threshold signature (TS) schemes
Desmedt '87
5
σ = Sign(m, sk)
σ1 = Sign(m, sk1)
σ5
sk
e.g., "3 out of 5" secret sharing
σ3
sk5
sk4
sk3
sk2
sk1
Verify(σ, m, pk)
(t out of n) sharing ⇒ tolerate t-1 compromises
Assuming uncorrelated vulnerabilities/failures
σ = Aggr(σ1, σ3, σ5, m)
Verifier need not be aware that the threshold signature came from signers 1, 3 and 5
Threshold signature (TS) schemes
Desmedt '87
6
Verify(σ, m, pk)
σ = Sign(m, sk)
σ1 = Sign(m, sk1)
σ5
sk
σ3
sk5
sk4
sk3
sk2
sk1
σ = Aggr(σ1, σ3, σ5, m)
A naive aggregator cannot aggregate correctly if one of the signers is malicious. But a sophisticated aggregator who verifies each signature share can aggregate correctly!
API for a TS scheme
DistKeyGen(1k, t, n) → ((ski, vki)i∈[1, n], pk)
Generates a key-pairs for all n signers, such that any subset of t out of n signers can collaborate to produce a threshold signature. (k denotes a security parameter; e.g., k = 128 bits)
SignShare(m, ski) → σi
Produces a signature share σi on m under signer i's secret key ski
VerifyShare(σi, m, vki) → 0/1
Verifies the signature share σi on m allegedly signed under signer i's secret key
Aggregate((i, σi)i∈[1, n]) → σ
Aggregates the t signature shares into a succinct threshold signature σ.
Verify(σ, m, pk) → 0/1
Verifies the threshold signature σ on m under the PK pk of the group of n signers
7
Distributed key generation (DKG) protocols are non-trivial and deserve their own special treatment
Multisig signature (MS) schemes
8
Verify(σ, m, {pk1, pk3, pk5})
σ = Aggr(σ1, σ3, σ5, m)
σ1 = Sign(m, sk1)
sk5
sk4
sk3
sk2
sk1
Verifier must be aware that the multisignature came from signers 1, 3 and 5
σ5 = Sign(m, sk5)
σ3 = Sign(m, sk3)
Multisig signature (MS) schemes
9
Verify(σ, m, {pk1, pk3, pk5})
σ = Aggr(σ1, σ3, σ5, m)
σ1 = Sign(m, sk1)
sk5
sk4
sk3
sk2
sk1
σ' = Aggr(σ3, σ5, m)
Verifier must be aware that the multisignature came from signers 1, 3 and 5
Verify(σ', m, {pk3, pk5})
…or that the multisignature came from signers 3 and 5
σ5 = Sign(m, sk5)
σ3 = Sign(m, sk3)
Multisig signature (MS) schemes
10
Verify(σ, m, { pk1, pk3, pk5})
σ = Aggr(σ1, σ3, σ5, m)
σ1 = Sign(m, sk1)
σ5
sk5
sk4
sk3
sk2
sk1
As in a TS, if one signer is malicious, naive aggregation will not produce a valid multisignature.
σ3 = Sign(m, sk3)
API for an MS scheme
KeyGen(1k) → (sk, pk)
Generates a key-pair for a signer. (k denotes a security parameter; e.g., k = 128 bits)
SignShare(m, ski) → σi
Produces a signature share σi on m under signer i's secret key ski
VerifyShare(σi, m, pki) → 0/1
Verifies the signature share σi on m was produced by the signer with public key pki
Aggregate(m, (σi, pki)i∈[1, n]) → σ
Aggregates n signature shares, each on the same message m, into a succinct multisignature σ.
Verify(σ, m, (pki)i∈[1, n]) → 0/1
Verifies the multisignature σ on m was produced by the n signers with the specified public keys
11
Aggregate signature (AS) schemes
12
Verify(σ, (mi, pki)i∈{1,3,5})
σ = Aggr((σi, mi, pki)i∈{1,3,5})
σ1 = Sign(m1, sk1)
σ5 = Sign(m5, sk5)
sk5
sk4
sk3
sk2
sk1
Verifier must be aware that the aggr. signature came from signers 1, 3 and 5 and that the signed messages are m1, m3 and m5.
σ3 = Sign(m3, sk3)
Aggregate signature (AS) schemes
13
Verify(σ, (mi, pki)i∈{1,3,5})
σ = Aggr((σi, mi, pki)i∈{1,3,5})
σ1 = Sign(m1, sk1)
σ5 = Sign(m5, sk5)
sk5
sk4
sk3
sk2
sk1
σ' = Aggr((σi, mi, pki)i∈{3,5})
Verifier must be aware that the aggr. signature came from signers 1, 3 and 5 and that the signed messages are m1, m3 and m5.
Verify(σ', (mi, pki)i∈{3,5})
…or that the aggr. signature came from signers 3 and 5 on messages m3 and m5.
σ3 = Sign(m3, sk3)
API for an AS scheme
KeyGen(1k) → (sk, pk)
Generates a key-pair for a signer. (k denotes a security parameter; e.g., k = 128 bits)
SignShare(m, ski) → σi
Produces a signature share σi on m under signer i's secret key ski
VerifyShare(σi, m, pki) → 0/1
Verifies the signature share σi on m was produced by the signer with public key pki
Aggregate((σi, mi, pki)i∈[1, n]) → σ
Aggregates n signature shares, each on a different message mi, into a succinct aggregate signature σ.
Verify(σ, (mi, pki)i∈[1, n]) → 0/1
Verifies the aggregate signature σ on messages m1, m2,…, mn ensuring that each signer i with public key pki signed message mi
14
When to use a TS, MS or an AS scheme?
TS:
MS:
AS:
15
Appendix
16
Threshold signatures... but why?
A key decentralized crypto primitive!
...and more are likely to come!
17
References
[Bold03] Threshold Signatures, Multisignatures and Blind Signatures Based on the Gap-Diffie-Hellman-Group Signature Scheme; by Boldyreva, Alexandra; in PKC 2003
18