Decentralized Anonymous Credentials

AbstractAnonymous credentials provide a powerful tool for making assertions about identity while maintaining privacy. However, a limitation of today’s anonymous credential systems is the need for a trusted credential issuer — which is both a single point of failure and a target for compromise. Furthermore, the need for such a trusted issuer can make it challenging to deploy credential systems in practice, particularly in the ad hoc network setting (e.g., anonymous peer-to-peer networks) where no single party can be trusted with this responsibility. In this work we propose a novel anonymous credential scheme that eliminates the need for a trusted credential issuer. Our approach builds on recent results in the area of electronic cash that, given a public append-only ledger, do not need a trusted credential issuer. Furthermore, given a distributed public ledger, as in, e.g., Bitcoin, our system requires no credential issuer at all and hence is decentralized. Using such a public ledger and standard cryptographic primitives, we propose and provide a proof of security for a basic anonymous credential system that allows users to make flexible identity assertions with strong privacy guarantees without relying on trusted parties. Finally, we discuss a number of practical applications for our techniques, including resource management in ad hoc networks and prevention of Sybil attacks. We implement our scheme and measure its efficiency.
Year2014
Link to the paperhttps://www.cs.purdue.edu/homes/clg/files/NDSS14.pdf
Relevance scoreVery relevant
Quality score4
LabelsAnonymous CredentialsDecentralized IssuerSybil resistance insights

Introduction

Anonymous credentials provide a powerful tool for making assertions about identity while maintaining privacy. However, a limitation of anonymous credential systems is the need for a trusted credential issuer — which is both a single point of failure and a target for compromise.

In this paper, the authors propose a novel anonymous credential scheme that eliminates the need for a trusted credential issuer. Given an append-only decentralized ledger (e.g., Bitcoin), this scheme requires no credential issuer at all and hence it is decentralized.

Paper’s Contribution

Overview of the Construction

Issuing the credentials:

Example:

Identity: Validator public key or validator index

Attributes: missed_attestations, missed_blocks, etc.

Identity assertion: To show Authenticity proofs obtained from Oracles for accessing attributes

Showing Credentials:

The user proves the following statements in Zero-Knowledge -

  1. The user knows a commitment CiC_i in the set (C1,C2,,CN)(C_1, C_2, \dots , C_N) of all credentials previously accept
  1. The user knows the opening (randomness) for the commitment.
  1. The user proves additional statements about the identity and attributes contained within the commitment CiC_i.

Decentralized Anonymous Credentials

A traditional anonymous credential system has two types of participants: users and organizations.

Notations:

  1. User secret key: skUsk_U
  1. The pseudonym of user AA  to organization OO: NymAONym^O_A
  1. Credential: cc
  1. Set of the credentials issued by the Organization: COC_O
  1. The auxiliary information (for example, identity assertion, organization name, etc): auxaux

Note: In decentralized anonymous credentials no single party represents the organization. Instead, a quorum of users who enforce a specific credential-issuing policy and collaboratively maintain a list of credentials issued so far.

The distributed anonymous credentials consist of a global distributed ledger, a list of transaction semantics, and the following algorithms (possibly probabilistic) -

The description of how these algorithms are used in the decentralized anonymous credentials

A. Overview of the Protocol Semantics

In this system, authors integrate the above algorithms with a decentralized hash chain network (Blockchain) as follows.

Formulating a pseudonym: Generated by the user offline

Obtaining a credential:

Showing a credential:

B. Trusting the Ledger

Why is the append-only transaction ledger necessary?

If the list of valid credentials can be evaluated by a set of untrusted nodes, then a user (Prover) could simply maintain a credential list compiled from network broadcasts and provide this list to the Verifier during a credential show. Although the credentials are valid by issuing party (not broadcast to anyone else), a malicious Verifier manipulates the Prover’s view of the network to include a poisoned-pill credential. Since the distributed ledgers (e.g., Bitcoin, Namecoin, etc) provide a shared view among a large number of nodes (users) can solve the above problem.

Preliminaries

A. Complexity Assumptions

  1. Strong RSA Assumption: Given a randomly generated RSA modulus nn and a random element yZny \in \mathbb{Z}_n^{*}, it is hard to compute xZnx \in \mathbb{Z}_n^{*} and e>1e > 1, s.t. xeyx^e \equiv y (mod nn). The RSA modulus can be restricted to the form n=pqn =pq, where p=2p+1p = 2p'+ 1 and q=2q+1q = 2q'+ 1 are safe primes.
  1. Discrete Logarithmic (DL) Assumption: Let GG be a cyclic group with generator gg. Given hGh \in G, it is hard to compute xx such that h=gxh = g^x.

B. Cryptographic Building Blocks

  1. Zero-knowledge Proofs:
    • The notation NIZKPoK{(x,y):h=gxc=gy}NIZKPoK\{(x, y) :h = g^x ∧ c = g^y \} denotes a non-interactive zero-knowledge proof of knowledge of the elements xx and yy that satisfy both h=gxh = g^x, c=gyc = g^y.
    • When these proofs are used to authenticate auxiliary data, the resulting non-interactive proofs are called signatures of knowledge. The signature of knowledge on message mm is denoted as ZKSoK[m]{(x,y):h=gxc=gy}ZKSoK[m]\{(x, y) :h = g^x ∧ c = g^y \}.

  1. Accumulators: The construction of these decentralized anonymous credentials uses accumulators on string RSA assumption.
    • AccumSetup(λ)paramsAccumSetup(λ) \rightarrow params: On input a security parameter, it outputs paramsparams (N,u)(N,u). First samples primes p,qp, q (polynomial dependence on the λ\lambda) and compute N=pqN=pq. Second, samples uQRNu \in QR_N, u1u \neq 1.
    • Accumulate(params,C)AAccumulate(params, C) \rightarrow A: On input paramsparams (N,u)(N,u) and a set of prime numbers C={c1,c2,,cnci[A,B]}C = \{c_1, c_2, \dots, c_n | c_i \in [A, B]\}, compute the accumulator A=uc1c2cnA = u^{c_1c_2\dots c_n} mod NN.
    • GenWitness(params,v,C)wGenWitness(params, v, C) \rightarrow w: On input (N,u)(N,u) and a set of prime numbers CC, and a value vCv \in C, the witness w=Accumulate(params,C{v})w = Accumulate(params, C\diagdown\{v\}).
    • AccVerify(params,A,v,ω){0,1}AccVerify(params, A, v, ω) \rightarrow \{0, 1\}: compute A=wvA' = w^v  mod NN and output 11 iff A=AA' = A.

    Camenisch and Lysyanskaya’s https://cs.brown.edu/people/alysyans/papers/camlys02.pdf paper shows the following

    • Incrementally updated: Given an existing accumulator AnA_n it is possible to add an element xx and produce An+1=AnxA_{n+1} = A^x_n mod NN.
    • Collision-resistance: Under strong RSA assumption, no PPT adversary can produce a pair (v,w)(v,w) such that vCv \notin C and yet AccVerifyAccVerify is satisfied.
    • zero-knowledge proof of knowledge: To prove a committed value is in an accumulator (Accumulator membership proof).
    NIZKPoK{(v,ω):AccVerify((N,u),A,v,ω)=1}NI-ZKPoK\{(v, ω) : AccVerify((N, u), A, v, ω) = 1\}
    1. Verifiable Random Functions (VRF): A pseudorandom function (PRF) https://dl.acm.org/doi/10.1145/6490.6503 is an efficiently computable function whose output cannot be distinguished (with non-negligible advantage) from random by a computationally bounded adversary. Authors denote the pseudorandom function as fk()f_k(·), where kk is a randomly chosen key. VRFs possess efficient proofs that a value is the output of a VRF on a set of related public parameters.
    1. Pedersen Commitments: The public parameters are a group GG of prime order qq, and set of generators (g0,g1,g2,,gm)(g_0,g_1, g_2,\dots,g_m). In order to commit to the values (v1,v2,,vm)(v_1,v_2,\dots, v_m), pick a random rZqr \in \mathbb{Z}_q^{*} and compute
    C=PedComm(v1,v2,,vm;r)=g0ri=1mgiviC = PedComm(v_1,v_2,\dots,v_m;r) = g^{r}_0\prod_{i=1}^{m}g_i^{v_i}

    A CONCRETE INSTANTIATION

    • Setup(1λ)paramsSetup(1^λ) \rightarrow params: On input a security parameter, AccumSetup(λ)AccumSetup(λ) and generate (N,u)(N,u). Next, generate primes p,qp,q such that p=2wq+1p = 2^wq + 1 for w1w \geq 1. Let G\mathbb{G} be an order-qq subgroup of Zp\mathbb{Z}^*_p , and select random generators (g0,,gn)(g_0,\dots, g_n) such that G=g0==gn\mathbb{G} = \langle g_0\rangle = \dots = \langle g_n\rangle . Output params=(N,u,p,q,g0,,gn)params = (N, u, p, q, g_0 ,\dots, g_n).
    • KeyGen(params)skKeyGen(params) \rightarrow sk: On input a set of parameters paramsparams, select and output a random master secret skZqsk \in Z_q.
    • FormNym(params,sk)(Nym,skNym)FormNym(params, sk ) \rightarrow (Nym , sk_{Nym} ): Given user’s secret key sksk, select a random rZqr \in \mathbb{Z}_q^*. Compute Nym=g0rg1skNym = g_0^rg_1^{sk} and set skNym=rsk_{Nym} = r. Output (Nym,skNym)(Nym, sk_{Nym}).
    • MintCred(params,sk,NymUO,skNymUO,attrs,aux)(c,skc,πM)MintCred(params, sk , Nym^O_U, sk_ {Nym^O_U},attrs, aux) \rightarrow (c, sk_c , \pi_M ): Given a nym NymUONym^O_U and its secret key skNymUOsk_{Nym^O_U}; attributes attrs=(a0,a1,,am)Zqmattrs = (a_0,a_1,\dots,a_m) \in \mathbb{Z}_q^m; and auxiliary data auxaux, select a random rZqr' \in Z_q and compute c=g0rg1ski=0mgi+2aic = g_0^{r'}g_1^{sk} \prod_{i=0}^{m}g_{i+2}^{a_i} s.t. {cc[A,B]}\{c| c\in [A,B]\}, set skc=rsk_c = r' and output (c,skc,πM)(c,sk_c,\pi_M). Where πM\pi_M is a signature of knowledge on πM\pi_M that the nym and the credential both belong to the same master secret sksk , i.e.:
    πM=ZKSoK[aux]{(sk,r,r):c=g0rg1ski=0mgi+2aiNym=g0rg1sk}\pi_M = ZKSoK[aux]\{(sk , r , r') : c = g_0^{r'}g_1^{sk} \prod_{i=0}^{m}g_{i+2}^{a_i} ∧ Nym = g_0^rg_1^{sk}\}

    submit (c,πM,attrs,NymUO,aux)(c, \pi_M , attrs, Nym^O_U , aux) to the public transaction ledger.

    • MintVerify(params,c,attrs,NymUO,aux,πM){0,1}MintVerify(params, c, attrs, Nym^O_U,aux,\pi_M)→\{0,1\}: verify that πM\pi_M is the signature of knowledge on auxaux. If the proof verifies successfully, output 11, otherwise output 00. The organization nodes should accept the credential to the ledger iff this algorithm returns 11.
    • Show(params,sk,NymUV,skNymUV,c,attrs,skc,CO)πSShow(params, sk , Nym^V_U , sk_{Nym^ V_U} , c, attrs, sk_c , C_O ) \rightarrow \pi_S : Compute A=Accumulate(params,CO)A = Accumulate(params, C_O) and w=GenWitness(params,c,CO)w = GenWitness(params, c, C_O). Output the following proof of knowledge:
    πS=NIZKPoK{(sk,r,r):AccVerify(params,A,c,w)=1c=g0rg1ski=0mgi+2aiNymUV=g0rg1sk}\pi_S = NIZKPoK\{(sk , r', r): AccVerify(params, A, c, w) = 1\\ ∧ c = g_0^{r'}g_1^{sk} \prod_{i=0}^{m}g_{i+2}^{a_i} ∧ Nym^V_U = g_0^rg_1^{sk}\}
    • ShowVerify(params,NymUV,πS,CO){0,1}ShowVerify(params, Nym^V_U , \pi_S , C_O) \rightarrow \{0, 1\}:
      • First compute A=Accumulate(params,CO)A = Accumulate(params, C_O).
      • Then, verify that πS\pi_S is the aforementioned proof of knowledge on c,COc, C_O , and NymUVNym^V_U using the known public values. If the proof verifies successfully, output 11, otherwise output 00.

    Extensions:

    1. k-show Credentials: In the system of https://eprint.iacr.org/2006/454.pdf, authority issues a credential on a user’s secret seed ss. To show a credential for the ithi^{th} time in validity period tt,
      1. The user generates a serial number SS using a verifiable random function (VRF) as S=fs(0ti)S = f_s(0||t||i) along with NIZKP for the correctness of SS.
      1. Application to the above construction: The user simply generates a random seed ssand includes this value in the commitment to be included in the transaction ledger. For kshowk-show, the user provably evaluates the VRF on the seed ss plus a secret counter ii.

    How does this extension reveal the user’s identity in the event of (k+1)-show(k+1)\text{-}show of the credential? (The intuition taken from the paper https://eprint.iacr.org/2006/454.pdf is as follows)

    • In ithshowi^{th}- show in time period tt, the user releases serial number S=fs(0,t,i)S = f_s(0, t, i), a double-show tag E=pkUfs(1,t,i)RE = pk_U · f_s(1, t, i)^R  (for a random R supplied by the verifier).
    • If a user shows k+1k+1 e-tokens during the same time interval, then two of the e-tokens must use the same SS.
    • The issuer (network nodes) can easily detect the violation and compute pkUpk_U from the two double-show tags, E=pkUfs(1,t,i)RE = pk_U · f_s(1, t, i)^R and E=pkUfs(1,t,i)RE' = pk_U · f_s(1, t, i)^{R'}.

    since, from the above two fs(1,t,i)=(E/E)1(RR)f_s(1, t, i) = (E/E')^{\frac{1}{(R−R')}} and pkU=E/fs(1,t,i)pk_U = E/fs(1,t,i)

    1. Credentials with Hidden Attributes: The user might wish to conceal the attributes requested or shown, instead he proves statements about them, e.g. proving the knowledge of a private key or proving the attribute is within a certain range.

    This can be achieved in two ways

    • Use of multi-message commitments where each message is an attribute. This increases the size of the zero-knowledge proofs (linearly with the number of messages)
    • To encode the attributes in one single value and then prove statements about that committed value rather than reveal it. For example, given a bit for a particular attribute is set to one, use the first xx bits of attribute one, use the next xx bits of attribute two, etc., and use range proofs for attributes.

    1. Stateful Credentials: A stateful anonymous credential system is a variant of an anonymous credential system where credential attributes encode some state that can be updated by issuing new credentials.

      For example, an operator can update its validator performance credential based on the latest state of attributes (missed_attestation and missed_blocks, etc.).

      This credential issuance is typically conditioned on the user showing a previous credential and offering proof that the new credential should be updated as a function of the original.

      • Update(params,sk,c,skc,CO,update_relation,state)(c,skc,πu)Update(params, sk, c, sk_c, C_O, update\_relation, state') \rightarrow (c', sk_c^{'}, \pi_u): Given the previous credential information and new state state=(s0,s1,,sm)Zqmstate' = (s_0', s_1', \dots, s_m') \in \mathbb{Z}_q^m, and an update relation update_relationupdate\_relation, generate a fresh random serial number SZqS' \in Z_q, and random value rZqr' \in Z_q, compute the following and construct the proof πu\pi_u
      c=g0rg1skg2Si=0mgi+3si,A=Accumulate(params,CO),w=GenWitness(params,c,CO)c' = g_0^{r'}g_1^{sk}g_2^{S'} \prod_{i=0}^{m}g_{i+3}^{s'_i}, \\A = Accumulate(params, C_O), w = GenWitness(params, c, C_O)

    output=(c,skc,πu)output = (c', sk_c', \pi_u), where skc=(S,state,r)sk_c' = (S', state', r') and

    πu=NIZKPoK{(sk,w,c,state,r,c,S,state,r):AccVerify(params,A,c,w)=1c=g0rg1skg2Si=0mgi+3sic=g0rg1skg2Si=0mgi+3siupdate_relation(state,state)=1}\pi_u = NIZKPoK\{(sk, w, c, state, r, c', S', state', r'): AccVerify(params, A, c, w) = 1\\ ∧ c = g_0^{r}g_1^{sk}g_2^{S} \prod_{i=0}^{m}g_{i+3}^{s_i} ∧ c' = g_0^{r'}g_1^{sk}g_2^{S'} \prod_{i=0}^{m}g_{i+3}^{s'_i} ∧ update\_relation(state, state') = 1\}

    • UpdateVerify(params,c,CO,πu){0,1}UpdateVerify(params, c, C_O, \pi_u) \rightarrow \{0, 1\}: Given a stateful credential cc, a credential set COC_O, and proof πu\pi_u, output 11 if πu\pi_u is correct, the proved state transition is a legal one, and the serial number SS was not previously used. Otherwise 00.

    Integrating with Proof-of-work Bulletin Boards

    Integration:

    Namecoin provides a built-in storing of key-value pairs and scans the list of the existing list of names. Thus, we can scan credentials, validate and then accumulate them.

    For Alice to obtain a credential, she:

    1. Purchase some name from the namespace by registering a public key

    11 665a 665a\dots OP_2DOP\_2D

    OP_DUPOP\_DUP OP_HASH160 OP\_HASH160 6c1abe34 6c1abe34

    OP_EQUALVERIFYOP\_EQUALVERIFY OP_CHECKSIG OP\_CHECKSIG

    1. Prepares a fresh credential with some attributes (attrsattrs) and any supporting documentation necessary for her identity claim (auxaux) and stores the private portion of the credential (sk,r,r)(sk, r, r').
    1. Updates, using the public key from step 1, her registered name to contain a credential and its supporting documentation.

    22 642f7 642f7\dots 7b7b\dots

    OP_2DROPOP\_2DROP OP_2DROP OP\_2DROP

    OP_DUPOP\_DUP OP_HASH160 OP\_HASH160

    14d14d\dots OP_EQUALVERIFYOP\_EQUALVERIFY OP_CHECKSIG OP\_CHECKSIG

    To show the credential to Bob, Alice:

    1. Scans the list of added names and retrieves all candidate credentials
    1. Checks the supporting documentation for each candidate and puts valid ones in CC.
    1. Runs showshow and sends the result to Bob.
    1. Bob does steps 11 and 22 and computes CC.
    1. Bob runs ShowVerifyShowVerify on Alice’s supplied credential and CC to verify it

    Supporting documentation and verification:

    • registration fee, no verification is necessary.
    • Digital signature to be verified.
    • Some assertion about resource management, e.g. proof of storage/proof of retrievability to be verified in the case of TPM (Trusted Platform Module).
    • Authentication proofs for accessing off-chain data from Oracles.

    Operating cost:

    • Fee for purchasing the names ((<0.01< 0.01 USD as on 7/31/20137/31/2013)).
    • A small fee for posting data on the blockchain (e.g., double spend tags and serial numbers in k-showk\text{-}show credentials).

    Latency:

    Depends on the block creation rate and the number of confirmations of the Blockchain network.

    Applications

    Mitigating Sybil attacks in ad hoc networks: One common approach is to require that clients solve proof-of-work (resource-consuming challenges) that typically involve either storage or computation. This allows clients to re-use the single proof-of-work in an anonymous fashion. One solution to this problem is to use kshowk-show anonymous credentials. This allows the peer to obtain a credential that can be used a limited number of times or a limited number of times within a given time period. When a peer exceeds the k-showk\text{-}show threshold (e.g., by cloning the credential for a Sybil attack), the credential can be identified and revoked. The paper https://ieeexplore.ieee.org/document/1698607 describes computational puzzles as Sybil defenses.

    Performance:

    There are four underlying operations:

    • Minting a credential
    • Verifying that the mint is correct
    • Showing a credential
    • Verifying that show.

    Showing and verifying credentials also entails computing the accumulation of all or all but one of the current credentials. For each new credential added, the user updates both the accumulator and witness for which it intends to show the credential.

    1. The experiments we measured in seconds and were repeated for 500500 iterations.
    1. The complexity of the proof of knowledge generated during the credential show is reduced by parallelizing the independent computations.
    Source: https://www.cs.purdue.edu/homes/clg/files/NDSS14.pdf
    Source:https://www.cs.purdue.edu/homes/clg/files/NDSS14.pdf

    ..

    References:

    1. Decentralized Anonymous Credentials, https://eprint.iacr.org/2013/622.pdf
    1. “Dynamic accumulators and application to efficient revocation of anonymous credentials,” in CRYPTO, 2002, http://cs.brown.edu/~anna/papers/camlys02.pdf.
    1. O. Goldreich, S. Goldwasser, and S. Micali, “How to construct random functions,” Journal of the ACM, 1986, https://dl.acm.org/doi/10.1145/6490.6503.
    1. Y. Dodis and A. Yampolskiy, “A verifiable random function with short proofs and keys,” ser. PKC, 2005, https://eprint.iacr.org/2004/310.pdf.