In this case one cert gets defeated and you go the odds of that number being that low are 2^-384. Essentially impossible if it were randomly selected. It's much more likely you didn't choose that at random so I start guessing a bunch of other low numbers for your other certificates and find them quickly.
You would say the same of any seed I gave you. You've just artificially assigned this number with some sort of emotional importance.
> In this case one cert gets defeated and you go the odds of that number being that low are 2^-384.
"Playing roulette, in isolation after RED - RED - RED - RED - RED, there is not a higher chance of getting BLACK than RED in the next run. But in practice, one would be correct in concluding that it will probably be BLACK. The proof is that in our test, the next run gave BLACK".
Said differently, it was not particularly unlikely that the number would be 4. But maybe it got the attention of the person who decided to try assuming that it was a mistake, and they were indeed lucky.
The hypothesis is "I see a small number, I can test if it is broken or not... oh it is". Could totally have been "no it's all good, just happened to be a small number".
I can think any number of programming mistakes that will result in a supposed (pseudo-)random number generator to be be biased to very small numbers. I have made such mistakes myself.
By any reasonable estimate, the probability of randomly picking a number below 256 is MUCH smaller than the probability of someone having made a mistake.
That doesn't make sense, does it?
If you generate a random number with equal distribution in a gigantic range, 0 is just as likely to happen as any other number in the range, right?
That's the meaning of "equal distribution".
In a working RNG, every number has equal probability.
But there's a probability <1 that the RNG is working as it should and a probability >0 that the RNG erroneously generates numbers that aren't equally distributed.
And because the range of possible numbers is so large and the probability of a mistake is not that tiny, a small result is more likely to be an error than a random result that happens to be small.
If I write a program to flip a coin and it generates heads 30 times in a row, is it more likely that this is just a random result or that I made a mistake in my programming?
One probability is 2^30, and the probability that someone makes an error resulting in this pattern is probably higher than 1/2^30.
It just happened that that particular number got the attention of a human, which was luck. But in terms of statistics, this number was not less likely than another one.
I have an insanely unlikely unique car licence plate number to sell you.
In short, raising the floor doesn’t really hurt the search space meaningfully.
In theory, all values would be equally random. In practice, some results are exceedingly more likely to occur when something's wrong with the algorithm.
While any given outcome of flipping a coin randomly N times is equally likely, if that series looks like [heads, heads, heads, heads, ...], then there's probably something other than pure random affecting the output.
That said, a sanity check on the value somewhere in the code would indeed have prevented this.
More generally, it is common to sample a bit string and use that as a seed for a PRG, from which the private key is generated. So in that case the range is [0, 2^k] and what matters is the quality of the randomness. Unfortunately high-quality randomness is not always available, especially for embedded devices and rack-mounted "appliances."
Its the range that changes.
you can either try and guess the key from
range(0, 255) (which is easy!)
or
range(0, 39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112319)
(it exceeds the heat death of the universe)
I wonder how they would argue in court, like "I guess we were unlucky huh ?"