The Digital Signature Algorithm (DSA) is a public-key cryptosystem and Federal Information Processing Standard for digital signatures, based on the mathematical concept of modular exponentiation and the discrete logarithm problem. In a public-key cryptosystem, two keys are generated: data can only be encrypted with the public key and encrypted data can only be decrypted with the private key. DSA is a variant of the Schnorr and ElGamal signature schemes.[1]
The National Institute of Standards and Technology (NIST) proposed DSA for use in their Digital Signature Standard (DSS) in 1991, and adopted it as FIPS 186 in 1994.[2] Five revisions to the initial specification have been released. The newest specification is: FIPS 186-5 from February 2023. DSA is patented but NIST has made this patent available worldwide royalty-free. Specification FIPS 186-5 indicates DSA will no longer be approved for digital signature generation, but may be used to verify signatures generated prior to the implementation date of that standard.
The DSA works in the framework of public-key cryptosystems and is based on the algebraic properties of modular exponentiation, together with the discrete logarithm problem, which is considered to be computationally intractable. The algorithm uses a key pair consisting of a public key and a private key. The private key is used to generate a digital signature for a message, and such a signature can be verified by using the signer's corresponding public key. The digital signature provides message authentication (the receiver can verify the origin of the message), integrity (the receiver can verify that the message has not been modified since it was signed) and non-repudiation (the sender cannot falsely claim that they have not signed the message).
In 1982, the U.S government solicited proposals for a public key signature standard. In August 1991 the National Institute of Standards and Technology (NIST) proposed DSA for use in their Digital Signature Standard (DSS). Initially there was significant criticism, especially from software companies that had already invested effort in developing digital signature software based on the RSA cryptosystem.[1] Nevertheless, NIST adopted DSA as a Federal standard (FIPS 186) in 1994. Five revisions to the initial specification have been released: FIPS 186–1 in 1998,[3] FIPS 186–2 in 2000,[4] FIPS 186–3 in 2009,[5] FIPS 186–4 in 2013,[6] and FIPS 186–5 in 2023.[7] Standard FIPS 186-5 forbids signing with DSA, while allowing verification of signatures generated prior to the implementation date of the standard as a document. It is to be replaced by newer signature schemes such as EdDSA.[8]
DSA is covered by, filed July 26, 1991 and now expired, and attributed to David W. Kravitz,[9] a former NSA employee. This patent was given to "The United States of America as represented by the Secretary of Commerce, Washington, D.C.", and NIST has made this patent available worldwide royalty-free.[10] Claus P. Schnorr claims that his (also now expired) covered DSA; this claim is disputed.[11]
In 1993, Dave Banisar managed to get confirmation, via a FOIA request, that the DSA algorithm hasn't been designed by the NIST, but by the NSA.[12]
OpenSSH announced that DSA is scheduled to be removed in 2025.[13]
The DSA algorithm involves four operations: key generation (which creates the key pair), key distribution, signing and signature verification.
Key generation has two phases. The first phase is a choice of algorithm parameters which may be shared between different users of the system, while the second phase computes a single key pair for one user.
H
|H|
H
|H|
N
N
L
L
N
N<L
N\leq|H|
L
N
N
q
L
p
p-1
q
h
\{2\ldotsp-2\}
g:=h(p\modp
g=1
h
h=2
p
q
g
Given a set of parameters, the second phase computes the key pair for a single user:
x
\{1\ldotsq-1\}
y:=gx\modp
x
y
The signer should publish the public key
y
x
A message
m
k
\{1\ldotsq-1\}
r:=\left(gk\bmodp\right)\bmodq
r=0
k
s:=\left(k-1\left(H(m)+xr\right)\right)\bmodq
s=0
k
\left(r,s\right)
The calculation of
k
r
r
k-1\bmodq
kq-2\bmodq
One can verify that a signature
\left(r,s\right)
m
0<r<q
0<s<q
w:=s-1\bmodq
u1:=H(m) ⋅ w\bmodq
u2:=r ⋅ w\bmodq
v:=
u1 | |
\left(g |
u2 | |
y |
\bmodp\right)\bmodq
v=r
The signature scheme is correct in the sense that the verifier will always accept genuine signatures. This can be shown as follows:
First, since , it follows that by Fermat's little theorem. Since
g>0
q
g
q
The signer computes
s=k-1(H(m)+xr)\bmodq
Thus
\begin{align} k&\equivH(m)s-1+xrs-1\\ &\equivH(m)w+xrw\pmod{q} \end{align}
Since
g
q
\begin{align} gk&\equivgH(m)wgxrw\\ &\equivgH(m)wyrw\\ &\equiv
u1 | |
g |
u2 | |
y |
\pmod{p} \end{align}
Finally, the correctness of DSA follows from
\begin{align} r&=(gk\bmodp)\bmodq\\ &=
u1 | |
(g |
u2 | |
y |
\bmodp)\bmodq\\ &=v \end{align}
With DSA, the entropy, secrecy, and uniqueness of the random signature value
k
k
k
x
This issue affects both DSA and Elliptic Curve Digital Signature Algorithm (ECDSA) – in December 2010, the group fail0verflow announced the recovery of the ECDSA private key used by Sony to sign software for the PlayStation 3 game console. The attack was made possible because Sony failed to generate a new random
k
This issue can be prevented by deriving
k
k
H(m)
x
In addition, malicious implementations of DSA and ECDSA can be created where
k
Below is a list of cryptographic libraries that provide support for DSA:
k