In
cryptography
Cryptography, or cryptology (from "hidden, secret"; and ''graphein'', "to write", or ''-logy, -logia'', "study", respectively), is the practice and study of techniques for secure communication in the presence of Adversary (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
Ronald Linn Rivest (;
born May 6, 1947) is an American cryptographer and computer scientist whose work has spanned the fields of algorithms and combinatorics, cryptography, machine learning, and election integrity.
He is an Institute Profess ...
,
Adi Shamir
Adi Shamir (; born July 6, 1952) is an Israeli cryptographer and inventor. He is a co-inventor of the Rivest–Shamir–Adleman (RSA) algorithm (along with Ron Rivest and Len Adleman), a co-inventor of the Feige–Fiat–Shamir identification sc ...
, and
Yael Tauman Kalai, and introduced at
ASIACRYPT in 2001. The name, ''ring signature'', comes from the ring-like structure of the signature
algorithm
In mathematics and computer science, an algorithm () is a finite sequence of Rigour#Mathematics, mathematically rigorous instructions, typically used to solve a class of specific Computational problem, problems or to perform a computation. Algo ...
.
Definition
Suppose that a set of entities each have public/private key pairs, (''P''
1, ''S''
1), (''P''
2, ''S''
2), ..., (''P''
''n'', ''S''
''n''). Party ''i'' can compute a ring signature σ on a message ''m'', on input (''m'', ''S''
''i'', ''P''
1, ..., ''P''
''n''). Anyone can check the validity of a ring signature given σ, ''m'', and the public keys involved, ''P''
1, ..., ''P''
''n''. 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.
Applications and modifications

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
The White House is the official residence and workplace of the president of the United States. Located at 1600 Pennsylvania Avenue Northwest (Washington, D.C.), NW in Washington, D.C., it has served as the residence of every U.S. president ...
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: 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 ''S''
1, ..., ''S''
''t'' ∈ can compute a (''t'', ''n'')-ring signature, σ, on a message, ''m'', on input (''m'', ''S''
1, ..., ''S''
''t'', ''P''
1, ..., ''P''
''n'').
;Linkable ring signatures: 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:
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
In analytic geometry, an asymptote () of a curve is a line such that the distance between the curve and the line approaches zero as one or both of the ''x'' or ''y'' coordinates Limit of a function#Limits at infinity, tends to infinity. In pro ...
output size
; 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
(for example, an e-voting with millions of participants). But for some application with relatively small
median
The median of a set of numbers is the value separating the higher half from the lower half of a Sample (statistics), data sample, a statistical population, population, or a probability distribution. For a data set, it may be thought of as the “ ...
input size such estimate may be acceptable.
CryptoNote implements
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, as well as with constant size.
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"
which takes a key
, an initialization value
, and a list of arbitrary values
.
is defined as
, where
is a trap-door function (i.e. an RSA public key in the case of RSA based ring signatures).
The function
is called the ring equation, and is defined below. The equation is based on a
symmetric encryption function :
:
It outputs a single value
which is forced to be equal to
. The equation
can be solved as long as at least one
, and by extension
, can be freely chosen. Under the assumptions of RSA, this implies knowledge of at least one of the inverses of the trap door functions
(i.e. a private key), since
.
Signature generation
Generating a ring signature involves six steps. The plaintext is signified by
, the ring's public keys by
.
# Calculate the key
, using a
cryptographic hash function
A cryptographic hash function (CHF) is a hash algorithm (a map (mathematics), map of an arbitrary binary string to a binary string with a fixed size of n bits) that has special properties desirable for a cryptography, cryptographic application: ...
. This step assumes a
random oracle
In cryptography, a random oracle is an oracle (a theoretical black box) that responds to every ''unique query'' with a (truly) random response chosen uniformly from its output domain. If a query is repeated, it responds the same way every tim ...
for
, since
will be used as key for
.
# Pick a random glue value
.
# Pick random
for all ring members but yourself (
will be calculated using the signer's private key), and calculate corresponding
.
# Solve the ring equation for
# Calculate
using the signer's private key:
# The ring signature now is the
-tuple
Signature verification
Signature verification involves three steps.
# Apply the public key trap door on all
:
.
# Calculate the symmetric key
.
# Verify that the ring equation holds
.
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 = one
1 (one, unit, unity) is a number, numeral, and glyph. It is the first and smallest positive integer of the infinite sequence of natural numbers. This fundamental property has led to its unique uses in other fields, ranging from science to sp ...
* 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 = random.randint(0, self.q)
e = self._g(s self.k e, self.k n)
v = self._E(v ^ e)
if (i + 1) % self.n 0:
c = v
s = self._g(v ^ u, self.k d, self.k n)
return + s
def verify_message(self, m: str, X) -> bool:
self._permut(m)
def _f(i):
return self._g(X + 1 self.k e, self.k n)
y = map(_f, range(len(X) - 1))
y = list(y)
def _g(x, i):
return self._E(x ^ y
r = functools.reduce(_g, range(self.n), X
return r X
def _permut(self, m):
msg = m.encode("utf-8")
self.p = int(hashlib.sha1(msg).hexdigest(), 16)
def _E(self, x):
msg = f"".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 and several other
cryptocurrencies
A cryptocurrency (colloquially crypto) is a digital currency designed to work through a computer network that is not reliant on any central authority, such as a government or bank, to uphold or maintain it.
Individual coin ownership records ...
use this technology.
See also
*
Witness-indistinguishable proofs
References
{{Creative Commons text attribution notice, url=https://www.getmonero.org/resources/moneropedia/ringsignatures.html, cc=bysa4
Public-key cryptography
Digital signature schemes