在密钥生成过程中,GnuPG显示:
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
现在我想知道:这个随机数据在素数生成中的用法是什么?我对Erathosthénis的筛子很熟悉,但不能想到将这些数据应用到筛子中。我也知道Rabin-Miller强大的测试可以使用随机数据作为mod n,但不确定是否是这种情况。
答案 0 :(得分:1)
2048位RSA中的公共模数,例如是两个1024/1025位随机素数的乘积,其二进制分解的最大和最低有效位设置为1。其余的是随机的,整数测试的是素数:
// to generate a 16-bit prime
// the MSB must be one, if the prime is to be 16-bit
// and the LSB must be one, because all primes (p > 2) are odd
a = rand(); // between 0 and MAX_INT
a &= 0x7ffe; // Leave 14 middle bits as is
a |= 0x8001; // Force MSB and LSB to one
while (!is_prime(a)) a += 2;
因此我们从一个随机整数开始,然后将候选者增加2,直到找到一个。对is_prime
的呼叫次数通常在log2(N)(IIRC)的范围内。通过计算+ = N(a)可以略微改善这一点,其中N使用SoE来跳过几个小素数的倍数。
取两个随机数可用于产生31-32位RSA模数。
在实践中,素数测试是用Rabin-Miller或其他强测试进行的,因为SoE会有很大的内存需求,并且需要一个难以理解的步骤来跳过sqrt范围内的所有素数(2 ^ 1024)〜= 2 ^ 512。