[gnupg-devel] Re: True RNG and GnuPG / libgcrypt
Nelson H. F. Beebe
beebe at math.utah.edu
Thu Oct 3 01:30:28 CEST 2013
Matthias-Christian Ott <ott at mirix.org> responds on Wed, 02 Oct 2013
21:54:12 +0200 to an earlier question about possible direct-access
to random-number-producing devices:
>> ...
>> If you want to use the output of the random number generator directly
>> you should somehow know how much true randomness per bit of output it
>> yields. Feeding the output of the random number generator into
>> /dev/random has the advantage that it gets mixed with other sources of
>> randomness and that there is a single implementation that can be
>> peer-reviewed.
>> ...
That is definitely good advice.
However, it is important to remember a distinction between the
/dev/urandom and /dev/random device interfaces available on some
flavors of Unix:
Both produce random streams of bits, but /dev/urandom
generally continues to produce output for every read, whereas
/dev/random may block until the interface believes that enough
additional entropy has been collected to produce more random
bits.
That means that reading /dev/random makes you susceptible to
denial-of-service attacks that could be as simple as this:
dd ibs=10240 count=1 < /dev/urandom > /dev/null
I just tried that on one of my GNU/Linux servers and had the process
hang for tens of seconds; changing it to read from /dev/urandom
instead produced 10KB of data in 2 msec. I then increased the count
from 1 to 10240, and pulled from /dev/urandom 100MB of random data in
6 to 20 seconds on a half-dozen different servers.
If you have a single-user single-process machine, you might be immune
to such attacks, but change either, or both, qualifiers "single-" to
"multi-", and you could be a victim, even if the other consumer(s) of
random bits from /dev/random are just trying to get data for their own
use, rather than intentionally trying to deny YOU access to the
device.
If you are concerned about possible bias from a random-number
generating device, here is an old technique that can fix it:
Assume that the device is biased, but that the bias is
CONSTANT. Then, it produces a 0-bit with probability p, and a
1-bit with probability 1 - p. Take two successive bits, and
look at the four possible outcomes:
0 0 prob. = p * p = p^2
0 1 prob. = p(1 - p)
1 0 prob. = (1 - p)p = p(1 - p)
1 1 prob. = (1 - p)^2
The cases 0 0 and 1 1 have different probabilities (unless p =
1/2, but that is not possible because we said the generator is
biased), so discard pairs of identical bits.
The cases 0 1 and 1 0 have equal probability, so choose the
second bit of each input pair where the two bits differ, and
otherwise read a second pair of bits and retry. Assemble the
chosen bits into an output stream. That stream contains 0 and
1 bits, each with equal probability.
If p is near 1/2, then you consume about 8 bits for every 2 bits
output, so your efficiency is only 0.25, and you have additional
software overhead of working at the bit-level with shifting and
counting, instead of at the higher level of random bytes and words.
As p tends to either 0 or 1, the efficiency tends to 0.
Of course, there could still be a problem, if the generator perversely
gets stuck in a mode where it produces, perhaps only for certain time
intervals, long sequences of alternating bits: 0 1 0 1 0 1 ....: your
resampling according to the above algorithm then produces either 0 0 0
0 ... or 1 1 1 1 ..., sequences that are probably not what you
expected.
Issues like that are why random-number device drivers try to mix
things up further, by arranging for multiple input sources, periodic
remixing of those sources, hashing or other digital-signature
algorithms, and so on.
For more on that general problem, see the extensive bibliography of
more than 3500 publications on generating, testing, and sampling of
pseudorandom numbers at
http://www.math.utah.edu/pub/tex/bib/prng.bib
http://www.math.utah.edu/pub/tex/bib/prng.html
The two URLs look almost identical in a browser, but the second has
live hyperlinks, and the first is needed by BibTeX and associated
bibliographic software.
-------------------------------------------------------------------------------
- Nelson H. F. Beebe Tel: +1 801 581 5254 -
- University of Utah FAX: +1 801 581 4148 -
- Department of Mathematics, 110 LCB Internet e-mail: beebe at math.utah.edu -
- 155 S 1400 E RM 233 beebe at acm.org beebe at computer.org -
- Salt Lake City, UT 84112-0090, USA URL: http://www.math.utah.edu/~beebe/ -
-------------------------------------------------------------------------------
More information about the Gnupg-devel
mailing list