Jump to content

Cryptographically secure pseudorandom number generator: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
MarioS (talk | contribs)
fixed refs
MarioS (talk | contribs)
→‎Definitions: started fixing syntax and improving presentation
Line 28: Line 28:


==Definitions==
==Definitions==
A deterministic polynomial time computable function ''G'' : {0, 1}<sup>''k''</sup> {0, 1}<sup>''p''(''k'')</sup> for any positive integer ''k'' and some polynomial ''p''(·), is a '''pseudorandom number generator''' ('''PRG'''), if ''p''(''k'') > ''k'' for any ''k'', i.e., ''G'' stretches the length of input (seed), and for any probabilistic polynomial time algorithm ''A'', which outputs 1 or 0 as a distinguisher, we have
In the [[Asymptotic security|asymptotic setting]], a family of deterministic polynomial time computable functions <math>G_k : \{0, 1\}^k \to \{0, 1\}^{p(k)}</math> for some polynomial <math>p</math>, is a '''pseudorandom number generator''' ('''PRG'''), if it stretches the length of its input (''p(k) > k'' for any ''k''), and if its output is computationally indistinguishable from true randomess, i.e. for any probabilistic polynomial time algorithm ''A'', which outputs 1 or 0 as a distinguisher,


: |Pr[''x'' {0, 1}<sup>''k''</sup>, ''A''(''G''(''x''))=1] - Pr[''r'' {0, 1}<sup>''p''(''k'')</sup>, ''A''(''r'')=1]| < negl(''k''). <ref>''x'' ← ''X'' means the random variable ''x'' is chosen at uniformly random from the set ''X''.</ref><ref>{{citation|last1=Goldreich|first1=Oded|title=Foundations of cryptography I: Basic Tools|date=2001|publisher=Cambridge University Press|location=Cambridge|isbn=978-0-511-54689-1}}, def 3.3.1.</ref>
: <math>|Pr[x \leftarrow \{0, 1\}^k, A(G(x))=1] - Pr[r \leftarrow \{0, 1\}^{p(k)}, A(r)=1]| < \mu(k) </math> for some [[negligible function]] <math>\mu</math>.<ref>''x'' ← ''X'' means the random variable ''x'' is chosen at uniformly random from the set ''X''.</ref><ref>{{citation|last1=Goldreich|first1=Oded|title=Foundations of cryptography I: Basic Tools|date=2001|publisher=Cambridge University Press|location=Cambridge|isbn=978-0-511-54689-1}}, def 3.3.1.</ref>


It turns out for any function ''G'' : {0, 1}<sup>''k''</sup> {0, 1}<sup>''p''(''k'')</sup>, ''G'' is PRG if and only if ''G'' cannot predict next bit in polynomial time.<ref>{{citation|last1=Goldreich|first1=Oded|title=Foundations of cryptography I: Basic Tools|date=2001|publisher=Cambridge University Press|location=Cambridge|isbn=978-0-511-54689-1}}, Theorem 3.3.7.</ref>
There is an equivalent characterization: For any function family <math>G_k : \{0, 1\}^k \to \{0, 1\}^{p(k)}</math>, ''G'' is a PRG if and only if the next output bit of ''G'' cannot be predicted by a polynomial time algorithm.<ref>{{citation|last1=Goldreich|first1=Oded|title=Foundations of cryptography I: Basic Tools|date=2001|publisher=Cambridge University Press|location=Cambridge|isbn=978-0-511-54689-1}}, Theorem 3.3.7.</ref>


A PRG ''G'' that is called '''forward secure''' with block length ''t''(''k'') is a polynomial time computable function ''G'' : {0, 1}<sup>''k''</sup> → {0, 1}<sup>''k''</sup> × {0, 1}<sup>''t''(''k'')</sup>, where the input string ''s''<sub>''i''</sub> with length ''k'' is the current state at period ''i'', and the output (''s''<sub>''i''+1</sub>, ''y''<sub>''i''</sub>) consists of the next state ''s''<sub>''i''+1</sub> and the pseudorandom block ''y''<sub>''i''</sub> on period ''i''. Then if the initial state ''s''<sub>1</sub> is chosen at uniformly random from {0, 1}<sup>''k''</sup>, we have that for any ''i'', (''y''<sub>1</sub>''y''<sub>2</sub>···''y''<sub>''i''</sub>, ''s''<sub>''i''+1</sub>) is computationally indistinguishable from (''r''<sub>''i''·''t''(''k'')</sub>, ''s''<sub>''i''+1</sub>), in which ''r''<sub>''i''·''t''(''k'')</sub> is chosen at uniformly random from {0, 1}<sup>''i''·''t''(''k'')</sup>. <ref>{{citation|last1=Dodis|first1=Yevgeniy|title=Lecture 5 Notes of Introduction to Cryptography|url=http://cs.nyu.edu/courses/fall08/G22.3210-001/lect/lecture5.pdf|accessdate=3 January 2016}}, def 4.</ref>
A PRG ''G'' that is called '''forward secure''' with block length ''t''(''k'') is a polynomial time computable function ''G'' : {0, 1}<sup>''k''</sup> → {0, 1}<sup>''k''</sup> × {0, 1}<sup>''t''(''k'')</sup>, where the input string ''s''<sub>''i''</sub> with length ''k'' is the current state at period ''i'', and the output (''s''<sub>''i''+1</sub>, ''y''<sub>''i''</sub>) consists of the next state ''s''<sub>''i''+1</sub> and the pseudorandom block ''y''<sub>''i''</sub> on period ''i''. Then if the initial state ''s''<sub>1</sub> is chosen at uniformly random from {0, 1}<sup>''k''</sup>, we have that for any ''i'', (''y''<sub>1</sub>''y''<sub>2</sub>···''y''<sub>''i''</sub>, ''s''<sub>''i''+1</sub>) is computationally indistinguishable from (''r''<sub>''i''·''t''(''k'')</sub>, ''s''<sub>''i''+1</sub>), in which ''r''<sub>''i''·''t''(''k'')</sub> is chosen at uniformly random from {0, 1}<sup>''i''·''t''(''k'')</sup>. <ref>{{citation|last1=Dodis|first1=Yevgeniy|title=Lecture 5 Notes of Introduction to Cryptography|url=http://cs.nyu.edu/courses/fall08/G22.3210-001/lect/lecture5.pdf|accessdate=3 January 2016}}, def 4.</ref>


Forward security of PRG withstands state compromise extensions. In fact, we can construct a forward secure PRG with polynomial block length ''p''(''k'') - ''k'' from any PRG ''G'' : {0, 1}<sup>''k''</sup> → {0, 1}<sup>''p''(''k'')</sup>. That is, if we set ''G''(''s'') = (''G''<sub>0</sub>(''s''), ''G''<sub>1</sub>(''s'')), in which |''G''<sub>0</sub>(''s'')| = |''s''| = ''k'' and |''G''<sub>1</sub>(''s'')| = ''p''(''k'') - ''k'', then ''G'' is a forward secure PRG with ''G''<sub>0</sub> to be the next state and ''G''<sub>1</sub> to be the pseudorandom block of the current period.
Forward security of PRG withstands state compromise extensions. In fact, we can construct a forward secure PRG with polynomial block length ''p''(''k'') - ''k'' from any PRG ''G'' : {0, 1}<sup>''k''</sup> → {0, 1}<sup>''p''(''k'')</sup>. That is, if we set ''G''(''s'') = (''G''<sub>0</sub>(''s''), ''G''<sub>1</sub>(''s'')), in which |''G''<sub>0</sub>(''s'')| = |''s''| = ''k'' and |''G''<sub>1</sub>(''s'')| = ''p''(''k'') - ''k'', then ''G'' is a forward secure PRG with ''G''<sub>0</sub> to be the next state and ''G''<sub>1</sub> to be the pseudorandom block of the current period.


==Entropy extraction==
==Entropy extraction==

Revision as of 21:24, 3 January 2016

A cryptographically secure pseudo-random number generator (CSPRNG) or cryptographic pseudo-random number generator (CPRNG)[1] is a pseudo-random number generator (PRNG) with properties that make it suitable for use in cryptography.

Many aspects of cryptography require random numbers, for example:

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, 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.

Ideally, the generation of random numbers in CSPRNGs uses entropy obtained from a high-quality source, which might be a hardware random number generator or perhaps unpredictable system processes — though 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

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: first, that they pass statistical randomness tests; and secondly, that they hold up well under serious attack, even when part of their initial or running state becomes available to an attacker.[citation needed]

  • 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 better than 50%. Andrew Yao proved in 1982 that a generator passing the next-bit test will pass all other polynomial-time statistical tests for randomness.[2]
  • Every CSPRNG should withstand "state compromise extensions". 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 CSPRNG 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 , is a pseudorandom number generator (PRG), if it stretches the length of its input (p(k) > k for any k), and if its output is computationally indistinguishable from true randomess, i.e. for any probabilistic polynomial time algorithm A, which outputs 1 or 0 as a distinguisher,

for some negligible function .[3][4]

There is an equivalent characterization: For any function family , G is a PRG if and only if the next output bit of G cannot be predicted by a polynomial time algorithm.[5]

A PRG G that is called forward secure with block length t(k) is a polynomial time computable function G : {0, 1}k → {0, 1}k × {0, 1}t(k), where the input string si with length k is the current state at period i, and the output (si+1, yi) consists of the next state si+1 and the pseudorandom block yi on period i. Then if the initial state s1 is chosen at uniformly random from {0, 1}k, we have that for any i, (y1y2···yi, si+1) is computationally indistinguishable from (ri·t(k), si+1), in which ri·t(k) is chosen at uniformly random from {0, 1}i·t(k). [6]

Forward security of PRG withstands state compromise extensions. In fact, we can construct a forward secure PRG with polynomial block length p(k) - k from any PRG G : {0, 1}k → {0, 1}p(k). That is, if we set G(s) = (G0(s), G1(s)), in which |G0(s)| = |s| = k and |G1(s)| = p(k) - k, then G is a forward secure PRG with G0 to be the next state and G1 to be the pseudorandom block of the current period.

Entropy extraction

Santha and Vazirani proved that several bit streams with weak randomness can be combined to produce a higher-quality quasi-random bit stream.[7] Even earlier, John von Neumann proved that a simple algorithm can remove a considerable amount of the bias in any bit stream[8] which should be applied to each bit stream before using any variation of the Santha-Vazirani design.

Designs

In the discussion below, CSPRNG designs are divided into three classes: 1) those based on cryptographic primitives such as ciphers and cryptographic hashes, 2) those based upon mathematical problems thought to be hard, and 3) special-purpose designs. The last often introduce additional entropy when available and, strictly speaking, are not "pure" pseudorandom number generators, as their output is not completely determined by their initial state. This addition can prevent attacks even if the initial state is compromised.

Designs based on cryptographic primitives

  • A secure block cipher can be converted into a CSPRNG by running it in counter mode. This is done by choosing a random key and encrypting a 0, then encrypting a 1, then encrypting a 2, etc. The counter can also be started at an arbitrary number other than zero. Assuming an n-bit block cipher the output can be distinguished from random data after around 2n/2 blocks since, following the birthday problem, colliding blocks should become likely at that point, whereas a block cipher in CTR mode will never output identical blocks. For 64 bit block ciphers this limits the safe output size to a few gigabytes, with 128 bit blocks the limitation is large enough not to impact typical applications.
  • A cryptographically secure hash of a counter might also act as a good CSPRNG in some cases. In this case, it is also necessary that the initial value of this counter is random and secret. However, there has been little study of these algorithms for use in this manner, and at least some authors warn against this use.[vague][9]
  • Most stream ciphers work by generating a pseudorandom stream of bits that are combined (almost always XORed) with the plaintext; running the cipher on a counter will return a new pseudorandom stream, possibly with a longer period. The cipher can only be secure if the original stream is a good CSPRNG, although this is not necessarily the case (see the RC4 cipher). Again, the initial state must be kept secret.

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.
  • The Blum-Micali algorithm has an unconditional security proof based on the difficulty of the discrete logarithm problem but is also very inefficient.
  • 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 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.

Special designs

There are a number of practical PRNGs that have been designed to be cryptographically secure, including

Obviously, the technique is easily generalized to any block cipher; AES has been suggested (Young and Yung, op cit, sect 3.5.1).

Standards

Several CSPRNGs have been standardized. For example,

  • FIPS 186-2
  • NIST SP 800-90A: This standard has three uncontroversial CSPRNGs named Hash_DRBG, HMAC_DRBG, and CTR_DRBG; and a PRNG named Dual_EC_DRBG which has been shown to not be cryptographically secure and probably has a kleptographic NSA backdoor.
  • 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)

A good reference is maintained by NIST.

There are also standards for statistical testing of new CSPRNG designs:

NSA backdoor in the Dual_EC_DRBG PRNG

The Guardian and The New York Times have reported that the National Security Agency (NSA) inserted a PRNG into NIST SP 800-90A that had a backdoor which allows the NSA to readily decrypt material that was encrypted with the aid of Dual_EC_DRBG. Both papers report[15][16] that, as independent security experts long suspected,[17] 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 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.[18] RSA Security received a $10 million payment from the NSA to do so.[19]

Notes

  1. ^ Huang, Andrew (2003). Hacking the Xbox: An Introduction to Reverse Engineering. No Starch Press Series. No Starch Press. p. 111. ISBN 9781593270292. Retrieved 2013-10-24. [...] the keystream generator [...] can be thought of as a cryptographic pseudo-random number generator (CPRNG).
  2. ^ Andrew Chi-Chih Yao. Theory and applications of trapdoor functions. In Proceedings of the 23rd IEEE Symposium on Foundations of Computer Science, 1982.
  3. ^ xX means the random variable x is chosen at uniformly random from the set X.
  4. ^ Goldreich, Oded (2001), Foundations of cryptography I: Basic Tools, Cambridge: Cambridge University Press, ISBN 978-0-511-54689-1, def 3.3.1.
  5. ^ Goldreich, Oded (2001), Foundations of cryptography I: Basic Tools, Cambridge: Cambridge University Press, ISBN 978-0-511-54689-1, Theorem 3.3.7.
  6. ^ Dodis, Yevgeniy, Lecture 5 Notes of Introduction to Cryptography (PDF), retrieved 3 January 2016, def 4.
  7. ^ Miklos Santha, Umesh V. Vazirani (1984-10-24). "Generating quasi-random sequences from slightly-random sources" (PDF). Proceedings of the 25th IEEE Symposium on Foundations of Computer Science. University of California. pp. 434–440. ISBN 0-8186-0591-X. Retrieved 2006-11-29. {{cite conference}}: Unknown parameter |booktitle= ignored (|book-title= suggested) (help)
  8. ^ John von Neumann (1963-03-01). "Various techniques for use in connection with random digits". The Collected Works of John von Neumann. Pergamon Press. pp. 768–770. ISBN 0-08-009566-6.
  9. ^ Adam Young, Moti Yung (2004-02-01). Malicious Cryptography: Exposing Cryptovirology. sect 3.2: John Wiley & Sons. p. 416. ISBN 978-0-7645-4975-5.{{cite book}}: CS1 maint: location (link)
  10. ^ NIST. "A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications". NIST, Special Publication April 2010
  11. ^ A. Poorghanad, A. Sadr, A. Kashanipour" Generating High Quality Pseudo Random Number Using Evolutionary Methods", IEEE Congress on Computational Intelligence and Security, vol. 9, pp. 331-335 , May,2008 [1]
  12. ^ David Kleidermacher, Mike Kleidermacher. "Embedded Systems Security: Practical Methods for Safe and Secure Software and Systems Development". Elsevier, 2012. p. 256.
  13. ^ George Cox, Charles Dike, and DJ Johnston. "Intel’s Digital Random Number Generator (DRNG)". 2011.
  14. ^ Handbook of Applied Cryptography, Alfred Menezes, Paul van Oorschot, and Scott Vanstone, CRC Press, 1996, Chapter 5 Pseudorandom Bits and Sequences (PDF)
  15. ^ James Borger; Glenn Greenwald (6 September 2013). "Revealed: how US and UK spy agencies defeat internet privacy and security". The Guardian. The Guardian. Retrieved 7 September 2013.
  16. ^ Nicole Perlroth (5 September 2013). "N.S.A. Able to Foil Basic Safeguards of Privacy on Web". The New York Times. Retrieved 7 September 2013.
  17. ^ Bruce Schneier (15 November 2007). "Did NSA Put a Secret Backdoor in New Encryption Standard?". Wired. Retrieved 7 September 2013.
  18. ^ Matthew Green. "RSA warns developers not to use RSA products".
  19. ^ Joseph Menn (20 December 2013). "Exclusive: Secret contract tied NSA and security industry pioneer". Reuters.