Type of functions designed for being unsolvable by root-finding algorithms
A cryptographically secure pseudorandom number generator (CSPRNG) or cryptographic pseudorandom number generator (CPRNG) is a
pseudorandom number generator (PRNG) with properties that make it suitable for use in
cryptography. It is also loosely known as a cryptographic random number generator (CRNG).
The "quality" of the randomness required for these applications varies.
For example, creating a
nonce in some
protocols needs only uniqueness.
On the other hand, the generation of a master
key requires a higher quality, such as more
entropy. And in the case of
one-time pads, the
information-theoretic guarantee of perfect secrecy only holds if the key material comes from a true random source with high entropy, and thus any kind of pseudorandom number generator is insufficient.
Ideally, the generation of random numbers in CSPRNGs uses entropy obtained from a high-quality source, generally the operating system's randomness
API. However, unexpected correlations have been found in several such ostensibly independent processes. From an information-theoretic point of view, the amount of randomness, the entropy that can be generated, is equal to the entropy provided by the system. But sometimes, in practical situations, more random numbers are needed than there is entropy available. Also, the processes to extract randomness from a running system are slow in actual practice. In such instances, a CSPRNG can sometimes be used. A CSPRNG can "stretch" the available entropy over more bits.
Requirements
A cryptographically secure pseudorandom number generator (CSPRNG) or cryptographic pseudorandom number generator (CPRNG)[1] is a
pseudorandom number generator (PRNG) with properties that make it suitable for use in
cryptography. It is also loosely known as a cryptographic random number generator (CRNG),[2][3] which can be compared to
"true" vs. pseudo-random numbers.
The requirements of an ordinary PRNG are also satisfied by a cryptographically secure PRNG, but the reverse is not true. CSPRNG requirements fall into two groups:
Every CSPRNG should satisfy the
next-bit test. That is, given the first k bits of a random sequence, there is no
polynomial-time algorithm that can predict the (k+1)th bit with probability of success non-negligibly better than 50%.[4]Andrew Yao proved in 1982 that a generator passing the next-bit test will pass all other polynomial-time statistical tests for randomness.[5]
that they hold up well under serious attack, even when part of their initial or running state becomes available to an attacker.[6]
Every CSPRNG should withstand "state compromise extension attacks".[6]: 4 In the event that part or all of its state has been revealed (or guessed correctly), it should be impossible to reconstruct the stream of random numbers prior to the revelation. Additionally, if there is an entropy input while running, it should be infeasible to use knowledge of the input's state to predict future conditions of the CSPRNG state.
Example: If the PRNG under consideration produces output by computing bits of
π in sequence, starting from some unknown point in the binary expansion, it may well satisfy the next-bit test and thus be statistically random, as π appears to be a random sequence. (This would be guaranteed if π is a
normal number, for example.) However, this algorithm is not cryptographically secure; an attacker who determines which bit of pi (i.e. the state of the algorithm) is currently in use will be able to calculate all preceding bits as well.
Most PRNGs are not suitable for use as CSPRNGs and will fail on both counts. First, while most PRNGs outputs appear random to assorted statistical tests, they do not resist determined reverse engineering. Specialized statistical tests may be found specially tuned to such a PRNG that shows the random numbers not to be truly random. Second, for most PRNGs, when their state has been revealed, all past random numbers can be retrodicted, allowing an attacker to read all past messages, as well as future ones.
CSPRNGs are designed explicitly to resist this type of
cryptanalysis.
Definitions
In the
asymptotic setting, a family of deterministic polynomial time computable functions for some polynomial p, is a
pseudorandom number generator (PRNG, or PRG in some references), if it stretches the length of its input ( for any k), and if its output is
computationally indistinguishable from true randomness, i.e. for any probabilistic polynomial time algorithm A, which outputs 1 or 0 as a distinguisher,
There is an equivalent characterization: For any function family , G is a PRNG if and only if the next output bit of G cannot be predicted by a polynomial time algorithm.[8]
A forward-secure PRNG with block length is a PRNG , where the input string with length k is the current state at period i, and the output (, ) consists of the next state and the pseudorandom output block of period i, that withstands state compromise extensions in the following sense. If the initial state is chosen uniformly at random from , then for any i, the sequence must be computationally indistinguishable from , in which the are chosen uniformly at random from .[9]
Any PRNG can be turned into a forward secure PRNG with block length by splitting its output into the next state and the actual output. This is done by setting , in which and ; then G is a forward secure PRNG with as the next state and as the pseudorandom output block of the current period.
Santha and Vazirani proved that several bit streams with weak randomness can be combined to produce a higher-quality quasi-random bit stream.[10]
Even earlier,
John von Neumann proved that a
simple algorithm can remove a considerable amount of the bias in any bit stream,[11] which should be applied to each bit stream before using any variation of the Santha–Vazirani design.
those based upon mathematical problems thought to be hard.
Designs based on cryptographic primitives
A secure
block cipher can be converted into a CSPRNG by running it in
counter mode using, for example, a special construct that
NIST in SP 800-90A calls
CTR_DRBG. CTR_DBRG typically uses AES.
AES-
CTR DRBG is often used as a random number generator in systems that use AES encryption.[12][13]
The NIST CTR_DRBG scheme erases the key after the requested randomness is output by running additional cycles. This is wasteful from a performance perspective, but does not immediately cause issues with forward secrecy. However, realizing the performance implications, the NIST recommends an "extended AES-CTR-DRBG interface" for its
Post-Quantum Cryptography Project submissions. This interface allows multiple sets of randomness to be generated without intervening erasure, only erasing when the user explicitly signals the end of requests. As a result, the key could remain in memory for an extended time if the "extended interface" is misused. Newer "fast-key-erasure" RNGs erase the key with randomness as soon as randomness is requested.[14]
A stream cipher can be converted into a CSPRNG. This has been done with RC4,
ISAAC, and
ChaCha20, to name a few.
A cryptographically secure
hash might also be a base of a good CSPRNG, using, for example, a construct that NIST calls
Hash_DRBG.
An
HMAC primitive can be used as a base of a CSPRNG, for example, as part of the construct that NIST calls
HMAC_DRBG.
Number-theoretic designs
The
Blum Blum Shub algorithm has a security proof based on the difficulty of the
quadratic residuosity problem. Since the only known way to solve that problem is to factor the modulus, it is generally regarded that the difficulty of
integer factorization provides a conditional security proof for the Blum Blum Shub algorithm. However the algorithm is very inefficient and therefore impractical unless extreme security is needed.
Daniel Brown of
Certicom has written a 2006 security proof for
Dual EC DRBG, based on the assumed hardness of the Decisional Diffie–Hellman assumption, the x-logarithm problem, and the truncated point problem. The 2006 proof explicitly assumes a lower outlen (amount of bits provided per iteration) than in the Dual_EC_DRBG standard, and that the P and Q in the Dual_EC_DRBG standard (which were revealed in 2013 to be probably backdoored by NSA) are replaced with non-backdoored values.
Practical schemes
"Practical" CSPRNG schemes not only include an CSPRNG algorithm, but also a way to initialize ("
seed") it while keeping the seed secret. A number of such schemes have been defined, including:
Implementations of
/dev/random in Unix-like systems.
Yarrow, which attempts to evaluate the entropic quality of its seeding inputs, and uses SHA-1 and 3DES internally. Yarrow is used in
macOS and other Apple OS' up until about Dec. 2019. Apple has switched to Fortuna since then.
Fortuna, the successor to Yarrow, which does not attempt to evaluate the entropic quality of its inputs; it uses SHA-256 and "any good block cipher". Fortuna is used in FreeBSD. Apple changed to Fortuna for most or all Apple OS' beginning around Dec. 2019.
The Linux kernel CSPRNG, which uses ChaCha20 to generate data,[15] and
BLAKE2s to ingest entropy.[16]
arc4random, a CSPRNG in Unix-like systems that seeds from /dev/random. It originally is based on
RC4, but all main implementations now use
ChaCha20.[17][18][19]
ANSI X9.17 standard (Financial Institution Key Management (wholesale)), which has been adopted as a
FIPS standard as well. It takes as input a
TDEA (
keying option 2) key bundle k and (the initial value of) a 64-bit
random seeds.[20] Each time a random number is required it:
Obtains the current date/time D to the maximum resolution possible.
Computes a temporary value t = TDEAk(D)
Computes the random value x = TDEAk(s ⊕ t), where ⊕ denotes bitwise
exclusive or.
Updates the seed s = TDEAk(x ⊕ t)
Obviously, the technique is easily generalized to any block cipher;
AES has been suggested.[21] If the key k is leaked, the entire X9.17 stream can be predicted; this weakness is cited as a reason for creating Yarrow.[22]
All these above-mentioned schemes, save for X9.17, also mix the state of a CSPRNG with an additional source of entropy. They are therefore not "pure" pseudorandom number generators, in the sense that the output is not completely determined by their initial state. This addition aims to prevent attacks even if the initial state is compromised.[a]
Standards
Several CSPRNGs have been standardized. For example,
This withdrawn standard has four PRNGs. Two of them are uncontroversial and proven: CSPRNGs named Hash_DRBG[25] and HMAC_DRBG.[26]
The third PRNG in this standard,
CTR DRBG, is based on a
block cipher running in
counter mode. It has an uncontroversial design but has been proven to be weaker in terms of distinguishing attack, than the
security level of the underlying block cipher when the number of bits output from this PRNG is greater than two to the power of the underlying block cipher's block size in bits.[27]
When the maximum number of bits output from this PRNG is equal to the 2blocksize, the resulting output delivers the mathematically expected security level that the key size would be expected to generate, but the output is shown to not be indistinguishable from a true random number generator.[27] When the maximum number of bits output from this PRNG is less than it, the expected security level is delivered and the output appears to be indistinguishable from a true random number generator.[27]
It is noted in the next revision that claimed
security strength for CTR_DRBG depends on limiting the total number of generate requests and the bits provided per generate request.
The fourth and final PRNG in this standard is named
Dual EC DRBG. It has been shown to not be cryptographically secure and is believed to have a
kleptographic NSA backdoor.[28]
NIST SP 800-90A Rev.1: This is essentially NIST SP 800-90A with Dual_EC_DRBG removed, and is the withdrawn standard's replacement.
ANSI X9.17-1985 Appendix C
ANSI X9.31-1998 Appendix A.2.4
ANSI X9.62-1998 Annex A.4, obsoleted by ANSI X9.62-2005, Annex D (HMAC_DRBG)
The Guardian and The New York Times have reported in 2013 that the
National Security Agency (NSA) inserted a
backdoor into a
pseudorandom number generator (PRNG) of
NIST SP 800-90A which allows the NSA to readily decrypt material that was encrypted with the aid of
Dual EC DRBG. Both papers report[31][32] that, as independent security experts long suspected,[33] the NSA has been introducing weaknesses into CSPRNG standard 800-90; this being confirmed for the first time by one of the top secret documents leaked to the Guardian by
Edward Snowden. The NSA worked covertly to get its own version of the NIST draft security standard approved for worldwide use in 2006. The leaked document states that "eventually, NSA became the sole editor." In spite of the known potential for a
kleptographic backdoor and other known significant deficiencies with Dual_EC_DRBG, several companies such as
RSA Security continued using Dual_EC_DRBG until the backdoor was confirmed in 2013.[34]RSA Security received a $10 million payment from the NSA to do so.[35]
During
World War II, Japan used a cipher machine for diplomatic communications; the United States was able to
crack it and read its messages, mostly because the "key values" used were insufficiently random.
References
^The use of entropy-mixing after CSPRNG initialization has been question by
Daniel J. Bernstein.[23]
^Daniel J. Bernstein (2014-02-05).
"cr.yp.to: 2014.02.05: Entropy Attacks!". Is there any serious argument that adding new entropy all the time is a good thing? The Linux /dev/urandom manual page claims that without new entropy the user is "theoretically vulnerable to a cryptographic attack", but (as I've mentioned in various venues) this is a ludicrous argument