ring signature

{{Short description|Type of digital signature in cryptography}}

In cryptography, a ring signature is a type of digital signature that can be performed by any member of a set of users that each have keys. Therefore, a message signed with a ring signature is endorsed by someone in a particular set of people. One of the security properties of a ring signature is that it should be computationally infeasible to determine which of the set's members' keys was used to produce the signature. Ring signatures are similar to group signatures but differ in two key ways: first, there is no way to revoke the anonymity of an individual signature; and second, any set of users can be used as a signing set without additional setup.

Ring signatures were invented by Ron Rivest, Adi Shamir, and Yael Tauman Kalai, and introduced at ASIACRYPT in 2001.{{Cite book |last1=Rivest |first1=Ronald L. |title=Advances in Cryptology — ASIACRYPT 2001 |last2=Shamir |first2=Adi |last3=Tauman |first3=Yael |year=2001 |isbn=978-3-540-42987-6 |series=Lecture Notes in Computer Science |volume=2248 |pages=552–565 |chapter=How to Leak a Secret |doi=10.1007/3-540-45682-1_32 |author-link=Ron Rivest |author-link2=Adi Shamir |author-link3=Yael Tauman Kalai |chapter-url=https://doi.org/10.1007%2F3-540-45682-1_32}} The name, ring signature, comes from the ring-like structure of the signature algorithm.

Definition

{{Missing information|Definition|the definition. This section currently describes some useful properties of a ring signature but not the mathematical definition|date=April 2022}}

Suppose that a set of entities each have public/private key pairs, (P1, S1), (P2, S2), ..., (Pn, Sn). Party i can compute a ring signature σ on a message m, on input (m, Si, P1, ..., Pn). Anyone can check the validity of a ring signature given σ, m, and the public keys involved, P1, ..., Pn. If a ring signature is properly computed, it should pass the check. On the other hand, it should be hard for anyone to create a valid ring signature on any message for any set without knowing any of the private keys for that set.{{cite journal| last=Debnath| first=Ashmita| author2=Singaravelu, Pradheepkumar |author3=Verma, Shekhar |title=Efficient spatial privacy preserving scheme for sensor network|journal=Central European Journal of Engineering|date=19 December 2012| volume=3|issue=1|pages=1–10|doi=10.2478/s13531-012-0048-7|s2cid=137248994|doi-access=free}}

Applications and modifications

File:Ring-signature.svg

In the original paper, Rivest, Shamir, and Tauman described ring signatures as a way to leak a secret. For instance, a ring signature could be used to provide an anonymous signature from "a high-ranking White House official", without revealing which official signed the message. Ring signatures are right for this application because the anonymity of a ring signature cannot be revoked, and because the group for a ring signature can be improvised.

Another application, also described in the original paper, is for deniable signatures. Here the sender and the recipient of a message form a group for the ring signature, then the signature is valid to the recipient, but anyone else will be unsure whether the recipient or the sender was the actual signer. Thus, such a signature is convincing, but cannot be transferred beyond its intended recipient.

There were various works, introducing new features and based on different assumptions:

;Threshold ring signatures:{{cite book|last1=E. Bresson|last2=J. Stern|last3=M. Szyd lo|title=Advances in Cryptology — CRYPTO 2002 |chapter=Threshold Ring Signatures and Applications to Ad-hoc Groups |series=Lecture Notes in Computer Science|date=2002|volume=2442|pages=465–480| doi=10.1007/3-540-45708-9_30| isbn=978-3-540-44050-5| chapter-url=https://www.di.ens.fr/~bresson/papers/BreSteSzy02.pdf|doi-access=free}} Unlike standard "t-out-of-n" threshold signature, where t of n users should collaborate to sign a message, this variant of a ring signature requires t users to cooperate in the ring signing protocol. Namely, t parties S1, ..., St ∈ {P1, ..., Pn} can compute a (t, n)-ring signature, σ, on a message, m, on input (m, S1, ..., St, P1, ..., Pn).

;Linkable ring signatures:{{cite book|last1=Liu|first1=Joseph K.|last2=Wong|first2=Duncan S.|title=Computational Science and Its Applications – ICCSA 2005 |chapter=Linkable Ring Signatures: Security Models and New Schemes | journal=ICCSA| date=2005 |volume=2| pages=614–623|doi=10.1007/11424826_65|series=Lecture Notes in Computer Science|isbn=978-3-540-25861-2}} The property of linkability allows one to determine whether any two signatures have been produced by the same member (under the same private key). The identity of the signer is nevertheless preserved. One of the possible applications can be an offline e-cash system.

;Traceable ring signature:{{cite journal| last1=Fujisaki|first1=Eiichiro| last2=Suzuki| first2=Koutarou|title=Traceable Ring Signature|journal=Public Key Cryptography| date=2007| pages=181–200}} In addition to the previous scheme the public key of the signer is revealed (if they issue more than one signatures under the same private key). An e-voting system can be implemented using this protocol.

Efficiency

Most of the proposed algorithms have asymptotic output size O(n); i.e., the size of the resulting signature increases linearly with the size of input (number of public keys). That means that such schemes are impracticable for real use cases with sufficiently large n (for example, an e-voting with millions of participants). But for some application with relatively small median input size such estimate may be acceptable. CryptoNote implements O(n) ring signature scheme by Fujisaki and Suzuki in p2p payments to achieve sender's untraceability.

More efficient algorithms have appeared recently. There are schemes with the sublinear size of the signature,{{cite journal|last1=Fujisaki|first1=Eiichiro|title=Sub-linear size traceable ring signatures without random oracles|journal= IEICE Transactions on Fundamentals of Electronics, Communications and Computer Sciences|date=2011|volume=95|issue=1|pages=393–415| doi=10.1587/transfun.E95.A.151|bibcode=2012IEITF..95..151F}} as well as with constant size.{{cite book|last1=Au|first1=Man Ho|last2=Liu|first2=Joseph K. |last3=Susilo| first3=Willy| last4=Yuen|first4=Tsz Hon|title=Progress in Cryptology - INDOCRYPT 2006 |chapter=Constant-Size ID-Based Linkable and Revocable-iff-Linked Ring Signature |series=Lecture Notes in Computer Science | date=2006|volume=4329|pages=364–378| doi=10.1007/11941378_26|isbn=978-3-540-49767-7| url=https://ro.uow.edu.au/cgi/viewcontent.cgi?article=10250&context=infopapers}}

Implementation

=Original scheme=

The original paper describes an RSA based ring signature scheme, as well as one based on Rabin signatures. They define a keyed "combining function" C_{k,v}(y_1,y_2,\dots,y_n) which takes a key k , an initialization value v, and a list of arbitrary values y_1, \dots y_n . y_i is defined as g_i(x_i) , where g_i is a trap-door function (i.e. an RSA public key in the case of RSA based ring signatures).

The function C_{k,v}(y_1,y_2,\dots,y_n) is called the ring equation, and is defined below. The equation is based on a symmetric encryption function E_k:

: C_{k,v}(y_1,y_2,\dots,y_n) = E_k(y_n \oplus E_k(y_{n-1} \oplus E_k(\dots \oplus E_k(y_1 \oplus v) \dots)))

It outputs a single value z which is forced to be equal to v . The equation v = C_{k,v}(y_1,y_2,\dots,y_n)

can be solved as long as at least one y_i , and by extension x_i , can be freely chosen. Under the assumptions of RSA, this implies knowledge of at least one of the inverses of the trap door functions g^{-1}_i (i.e. a private key), since g^{-1}_i(y_i) = x_i .

==Signature generation==

Generating a ring signature involves six steps. The plaintext is signified by m, the ring's public keys by P_1,P_2,\dots,P_n.

  1. Calculate the key k=\mathcal{H}(m), using a cryptographic hash function. This step assumes a random oracle for \mathcal{H}, since k will be used as key for E_k.
  2. Pick a random glue value v.
  3. Pick random x_i for all ring members but yourself (x_s will be calculated using the signer's private key), and calculate corresponding y_i=g_i(x_i).
  4. Solve the ring equation for y_s
  5. Calculate x_s using the signer's private key: x_s=g_s^{-1}(y_s)
  6. The ring signature now is the (2n+1)-tuple (P_1,P_2,\dots,P_n;v;x_1,x_2,\dots,x_n)

==Signature verification==

Signature verification involves three steps.

  1. Apply the public key trap door on all x_i: y_i=g_i(x_i).
  2. Calculate the symmetric key k=\mathcal{H}(m).
  3. Verify that the ring equation holds C_{k,v}(y_1,y_2,\dots,y_n)=v.

== Python implementation ==

Here is a Python implementation of the original paper using RSA. Requires 3rd-party module PyCryptodome.

import os

import hashlib

import random

import Crypto.PublicKey.RSA

import functools

class Ring:

"""RSA implementation."""

def __init__(self, k, L: int = 1024) -> None:

self.k = k

self.l = L

self.n = len(k)

self.q = 1 << (L - 1)

def sign_message(self, m: str, z: int):

self._permut(m)

s = [None] * self.n

u = random.randint(0, self.q)

c = v = self._E(u)

first_range = list(range(z + 1, self.n))

second_range = list(range(z))

whole_range = first_range + second_range

for i in whole_range:

s[i] = random.randint(0, self.q)

e = self._g(s[i], self.k[i].e, self.k[i].n)

v = self._E(v ^ e)

if (i + 1) % self.n == 0:

c = v

s[z] = self._g(v ^ u, self.k[z].d, self.k[z].n)

return [c] + s

def verify_message(self, m: str, X) -> bool:

self._permut(m)

def _f(i):

return self._g(X[i + 1], self.k[i].e, self.k[i].n)

y = map(_f, range(len(X) - 1))

y = list(y)

def _g(x, i):

return self._E(x ^ y[i])

r = functools.reduce(_g, range(self.n), X[0])

return r == X[0]

def _permut(self, m):

msg = m.encode("utf-8")

self.p = int(hashlib.sha1(msg).hexdigest(), 16)

def _E(self, x):

msg = f"{x}{self.p}".encode("utf-8")

return int(hashlib.sha1(msg).hexdigest(), 16)

def _g(self, x, e, n):

q, r = divmod(x, n)

if ((q + 1) * n) <= ((1 << self.l) - 1):

result = q * n + pow(r, e, n)

else:

result = x

return result

To sign and verify 2 messages in a ring of 4 users:

size = 4

msg1, msg2 = "hello", "world!"

def _rn(_):

return Crypto.PublicKey.RSA.generate(1024, os.urandom)

key = map(_rn, range(size))

key = list(key)

r = Ring(key)

for i in range(size):

signature_1 = r.sign_message(msg1, i)

signature_2 = r.sign_message(msg2, i)

assert r.verify_message(msg1, signature_1) and r.verify_message(msg2, signature_2) and not r.verify_message(msg1, signature_2)

Cryptocurrencies

Monero{{cite web |title=Evaluation of Bulletproof Implementation |url=https://ostif.org/wp-content/uploads/2018/10/OSTIF-QuarksLab-Monero-Bulletproofs-Final2.pdf |publisher=Quarkslab |ref=18-06-439-REP}} and several other cryptocurrencies use this technology.{{cn|date=February 2024}}

See also

References

{{Creative Commons text attribution notice|url=https://www.getmonero.org/resources/moneropedia/ringsignatures.html|cc=bysa4}}

Category:Public-key cryptography

Category:Digital signature schemes