Erm. The general principle in cryptography is not to use the same entropy twice, if you can possibly avoid it.
Also, if you have a problem with your entropy source, feeding that low entropy input back in doesn't seem like it'll help much.
The thing is, with a proper entropy pool implementation adding in data with zero entropy
is safe, and any entropy, however little, accumulates.
Lets suppose my "pool" is exactly two bits of data. We start with it in a known state:
00
I'll add it additional entropy sources using XOR. First, lets add two bits from a broken entropy source, that outputs all ones:
00 xor 11 = 11
Basically that source repeatedly just flips the bits from one to the other. However, now I'm going to add in an entropy source where the first bit is broken, but the second bit is truly random:
00 xor 11 xor 1? = 0?
The attacker can figure out the first bit, but not the second. Lets add that totally broken entropy source again:
00 xor 11 xor 1? xor 11 = 1?
The attacker *still* can't guess the second bit. Now lets add an entropy source with the second bit broken, but the first bit OK:
00 xor 11 xor 1? xor 11 xor ?1 = ??
Totally random. Similarly in Bitcoin, if you take all the private keys in your keystore, XOR them together to create a seed, you'll have at least as much entropy in that seed as any one key in your keystore contains. If all you did was hash that seed to generate your next key and saved that key, XORing all your private keys together would
still produce a seed with the same amount of entropy.
OpenSSL's default random pool method, RAND_SSLeay in crypto/rand/md_rand.c, works in a kinda similar way. Data added to the pool is hashed, and then added to a rotating set of multiple blocks. When you want some bytes, those blocks get XORed together into a state, and the hash of that state is returned to the caller. (er, roughly anyway, I might have missed something reading the source code) This file is also where the Debian project screwed up and broke SSL key generation a few years back... We really want to avoid a similar mistake at all costs. Bitcoin on Debian systems in 2008 might have left your private keys guessable.
http://en.wikipedia.org/wiki/Fortuna_(PRNG) is a good explanation of another good PRNG, with provable bounds on how long it takes to get back to a secure system after a key compromise.
Anyway, I wrote up really rough notes/sketched out code on how you'd actually implement this idea:
https://github.com/petertodd/bitcoin/blob/devel.persistent-seed/persistent-seed-notes.txt