valid signatures on distinct messages recover a degree-$d$ polynomial key with probability $1-\mathsf{negl}(\lambda)$, even when a malicious signer generated them (Theorems 5 and 6).
Measured over BLS12-377 on an Apple M1. At $k=16$ it takes 1.785 ms (Table 1).
KeyForge's server must publish each expired private key every $\Delta$. GroupForge's expiry information is extracted from signatures that were already sent (§6.1, Table 3).
The problem
Signatures that are valid forever are a liability
A digital signature stays valid until the scheme breaks or the key leaks. That is exactly what you want for a contract. For email it is harmful. Under DKIM, the mail server signs every outgoing message with one domain key. Anyone who later obtains a leaked mailbox can prove who sent each message, which invites extortion and retaliation.
Attributable forever
Signatures verify indefinitely, so leaked messages can be authenticated to a third party.
Deniable, with upkeep
The server must keep publishing expired private keys, or rely on a publicly verifiable time-keeping service. Short-lived signatures need a random beacon and VDFs.
The key leaks itself
Once $k$ signatures exist, anyone can extract the private key and forge. Nothing has to be published later, and no extra service is needed.
The paper asks whether recipients can verify a signature while the sender still gains plausible deniability, "without requiring the constant release of old key materials or relying on any additional components". That sounds like it contradicts non-repudiation. DSKE's answer is an extractable set: $\mathsf{Extract}(\{(m_i,\sigma_i)\}_{i\in[k]}, pk)$ returns $sk$ with probability $\delta$ (Definition 7).
Interactive 1 · hash-based DSKE (§4.1)
Every Lamport signature gives away half of the key
A Lamport key is $2\lambda$ random strings $sk_i[b]$, and the public key is their hashes. To sign, you hash the message and reveal $sk_i[d_i]$ for every digest bit $d_i$. One signature is safe. But each new message reveals a fresh random half, and once every column $i$ has shown both $sk_i[0]$ and $sk_i[1]$, the union of signatures is the private key (Figure 1). This demo runs real SHA-256 with $\lambda=256$ in your browser.
Private key: 256 columns × 2 halves
- not yet revealed
- revealed earlier
- revealed by the latest signature
- $sk_1[1]$: never revealed
Each tile is column $i$ (row-major, $i=1\ldots256$): top half $sk_i[0]$, bottom half $sk_i[1]$.
Incomplete columns after $k$ signatures
- this run (measured in your browser)
- expectation $256/2^{k-1}$ (Lemma 1)
Table view
| $k$ | incomplete (this run) | expected | Thm 3 bound |
|---|
Failure branch
Switch to malicious signer. The signer grinds each message (appending a nonce) until the first digest bit is $0$. This is the attack in §4, limitation (3): $sk_1[1]$ is never revealed, so extraction never succeeds. Theorem 3 only covers trusted generation, and $\mathsf{DSKE}_{\mathsf{hash}}$ has no extractability under untrusted generation. The polynomial construction below fixes this.
Interactive 2 · polynomial-commitment DSKE (§5) → rate-limiting nullifier (§6.2)
$d$ points hide the key; $d+1$ points reveal it
In $\mathsf{DSKE}_{\mathsf{poly}}$ the private key is a degree-$d$ polynomial $f(X)$ and the public key is its KZG commitment $C_f$. A signature on $m$ is an opening of $f$ at $x=H(m)$, so each signature is one point $(x, f(x))$ plus a proof. Any $d+1$ such points interpolate to $f$. Here a user registers with an RLN server and posts messages. The server counts them, and on message $d+1$ it runs $\mathsf{Extract}$, publishes $sk_{\mathcal U}$ and expels the user.
What the server has seen
- signature point $(H(m), y)$
- polynomials of degree $\le d$ through every point
- extracted key $f'(X)$
This is a toy for intuition. It works over the rationals, with $x = H(m)$ taken as a SHA-256-derived value in $[-1,1]$ and small integer coefficients, and it computes no KZG commitment or proof. The real scheme works in $\mathbb{Z}_p$ over BLS12-377. There, below the threshold the key stays hidden by computational hiding (Definition 3) rather than by a picture, and interpolation binding (Definition 6) is what makes extraction work against a malicious signer (Theorem 6).
Source disagreement
The generic $\mathsf{Extract}$ in §5 says to return $\bot$ "if the number of distinct $m_i$ is less than $d$", yet it interpolates over $\{x_i,y_i\}_{i\in[d+1]}$, and Theorems 5 and 6 both require $k \ge d+1$. This demo follows the theorems ($d+1$), as does the RLN slashing rule ($\mathsf{MsgNum} > d$).
Interactive 3 · GroupForge, deniable email (§6.1)
One public key, many time chunks, no key publishing
GroupForge generates $2^{h_T}$ DSKE key pairs, one per time chunk of length $\Delta$, and publishes only the Merkle root $R$. An email sent during chunk $i$ is signed with $sk_i$ and carries $pk_i$ with its Merkle path. Once $k$ signatures exist in chunk $i$, anyone can run $\mathsf{Expire}$ to extract $sk_i$ and then $\mathsf{Forge}$ emails in that chunk. At that point a leaked email proves nothing. This is the $h_T=2$ tree of Figure 2. Advance the clock, send emails, and try the failure paths.
Merkle tree over $pk_1..pk_4$ · click a leaf to select it
- valid email
- deniable (chunk key extracted)
- forged
- rejected: arrived late
$k$ here is illustrative. Figure 2 uses groups of two, and the measured $\mathsf{GroupForge}_{\mathsf{kzg}}$ in Table 2 uses $k=32$. An email counts as valid if $\mathsf{Ver}$ accepted it on arrival. Read literally, $\mathsf{Expire}$ re-runs $\mathsf{Ver}$, whose clock check ($i = i'$) would reject signatures from a chunk that has already ended. The demo assumes the intended reading, that validity is judged at delivery.
Interactive 4 · measured performance (§7)
What extraction costs
Every value here is copied from Tables 1 and 2 (Rust prototypes on an Apple M1, 8 GB RAM, SHA-256 and BLS12-377 from arkworks). The controls only snap to the measured group sizes and tree heights. Both scales are logarithmic, because the values span microseconds to minutes.
Table 1 · per-operation time (log scale)
- $\mathsf{DSKE}_{\mathsf{lamp}}$ (SHA256), $k=64$ (its only measured size)
- $\mathsf{DSKE}_{\mathsf{kzg}}$ (BLS12-377), selected $k$
$\mathsf{DSKE}_{\mathsf{kzg}}$ extraction vs $k$
Only the four measured points are shown, with no fitted curve. The $\times$ labels are ratios between consecutive measurements, computed here. The paper says extraction "appears as approximately a quadratic function of the group size $k$".
Table view: Table 1
Table 2 · GroupForge per-operation time (log scale)
- $\mathsf{GroupForge}_{\mathsf{hash}}$ (SHA256)
- $\mathsf{GroupForge}_{\mathsf{kzg}}$ (SHA256, BLS12-377, $k=32$)
Table view: Table 2
Source disagreement
In Table 2, $\mathsf{GroupForge}_{\mathsf{kzg}}$ signing takes 1.554–1.722 ms. That is less than the 2.523 ms Table 1 reports for plain $\mathsf{DSKE}_{\mathsf{kzg}}$ signing at the same $k=32$, even though GroupForge's $\mathsf{Sign}$ calls the DSKE $\mathsf{Sign}$ and then adds a Merkle path. The hash variant behaves as expected (21.791 µs vs 17.625 µs). Both tables are reproduced as printed.
Observation
Table 2's key-generation times double exactly with each extra level of the tree (7.407 → 14.815 → 29.631 → 59.262 s, and 46.294 → 92.588 → 185.175 → 370.350 s), and they match $2^{h_T}$ × the Table 1 per-key cost (e.g. $2^{14} \times 2.825$ ms ≈ 46.29 s). They may have been computed from single-key measurements rather than timed end to end. The paper does not say which.
Guarantees
What each construction guarantees
| Construction | Unforgeability | Extraction, honest signer | Extraction, malicious signer | Assumptions & costs |
|---|---|---|---|---|
| $\mathsf{DSKE}_{\mathsf{lamp}}$ (§4.1) | 1-time adaptive CMA (Theorem 2) | $(k,\delta)$ with $\delta \ge 1-\lambda/2^{k-1}-\mathsf{negl}(\lambda)$ (Theorem 3) | ✗ no, signer can grind hashes (§4, limitation 3) | $H$ as random oracle; keys and signatures linear in $\lambda$ |
| $\mathsf{DSKE}_{\mathsf{poly}}$ / KZG (§5) | $d$-time adaptive CMA (Theorem 4) | $(k,1-\mathsf{negl}(\lambda))$ for any $k \ge d+1$ (Theorem 5) | ✓ $k \ge d+1$ (Theorem 6) | PCS security + interpolation binding (KZG: SDH in the AGM); trusted setup or ceremony (§8); signature $(\pi,y) \in G\times\mathbb{Z}_p$ |
Deniable signatures compared (Table 3)
| Scheme | No future actions (e.g. publishing keys) | No external services (e.g. random beacon) | No VDF |
|---|---|---|---|
| KeyForge [SPG21] | ✗ required | ✓ | ✓ |
| TimeForge [SPG21] | ✓ | ✗ required | ✓ |
| Short-lived signature [ABC23] | ✓ | ✗ required | ✗ required |
| $\mathsf{GroupForge}_{\mathsf{hash}}$ (based on $\mathsf{DSKE}_{\mathsf{hash}}$) | ✓ | ✓ | ✓ |
| $\mathsf{GroupForge}_{\mathsf{poly}}$ (based on $\mathsf{DSKE}_{\mathsf{poly}}$) | ✓ | ✓ | ✓ |
✓ means the scheme does not require the item in the column header. Table 3 in the paper.
Measured results
Tables 1 and 2, as printed
Testbed: macOS Monterey, Apple M1 (8-core, 3.2 GHz), 8 GB RAM. Prototypes in Rust. KZG from arkworks poly-commit on BLS12-377, and Merkle trees from arkworks crypto-primitives with SHA-256.
Table 1 · Performance of $\mathsf{DSKE}_{\mathsf{lamp}}$ and $\mathsf{DSKE}_{\mathsf{kzg}}$
"The probability of extracting the key in $\mathsf{DSKE}_{\mathsf{lamp}}$ is overwhelming in $k$, so the actual size of the extractable group can be smaller than $k=64$."
Table 2 · Performance of GroupForge constructions with $\Delta=0.5$ hour
Tree heights 14–17 correspond to 0.93, 1.87, 3.74 and 7.48 years of time chunks. Key generation dominates because $2^{h_T}$ key pairs are generated.
Where the paper disagrees with itself
- Extraction threshold. §5's $\mathsf{Extract}$ returns $\bot$ if there are fewer than $d$ distinct messages, but interpolates $d+1$ points. Theorems 5 and 6 state $k \ge d+1$. This page uses $d+1$.
- Private-key size. §8 says $f(X)$ "contains $d$ elements of $\mathbb{F}$, i.e., the coefficients $f_0,\ldots,f_{d-1}$". A polynomial in $\mathbb{F}^{\le d}(X)$ has $d+1$ coefficients $f_0,\ldots,f_d$.
- GroupForge signing vs DSKE signing. Table 2 reports $\mathsf{GroupForge}_{\mathsf{kzg}}$ signing (1.554–1.722 ms) faster than Table 1's $\mathsf{DSKE}_{\mathsf{kzg}}$ signing at $k=32$ (2.523 ms), even though the former includes the latter.
- Naming. Tables 1 and 2 label the polynomial construction $\mathsf{DSKE}_{\mathsf{kzg}}$ / $\mathsf{GroupForge}_{\mathsf{kzg}}$, while the text and Table 3 call it $\mathsf{DSKE}_{\mathsf{poly}}$ / $\mathsf{GroupForge}_{\mathsf{poly}}$. The charts use the table labels.
Cite
BibTeX
@inproceedings{wang2025dske,
title = {{DSKE}: Digital Signatures with Key Extraction},
author = {Wang, Zhipeng and Alpos, Orestis and Kavousi, Alireza and
Wong, Harry W. H. and Chau, Sze Yiu and Le, Duc V. and
Cachin, Christian},
booktitle = {CT-RSA 2025},
year = {2025}
}
@misc{cryptoeprint:2022/1753,
author = {Zhipeng Wang and Orestis Alpos and Alireza Kavousi and Harry W. H. Wong and Sze Yiu Chau and Duc V. Le and Christian Cachin},
title = {{DSKE}: Digital Signatures with Key Extraction},
howpublished = {Cryptology {ePrint} Archive, Paper 2022/1753},
year = {2022},
note={Available at: \url{https://eprint.iacr.org/2022/1753}}
}
Code availability
The paper does not link a code release. It describes Rust prototypes of $\mathsf{DSKE}_{\mathsf{lamp}}$, $\mathsf{DSKE}_{\mathsf{kzg}}$ and both GroupForge variants, built on the arkworks poly-commit and crypto-primitives libraries (§7). The full version, which includes the Winternitz-based construction and all proofs, is on ePrint.