我只是想了解RSA的密钥生成部分,更具体地说,选择p和q素数。给定模数的目标位长度n,我应该在哪个范围内生成p和q?
模量n是p和q的乘积,其中p和q都是素数。我已经读过p和q应该相对接近,并且在sqrt(n)附近。如果目标位长度是例如32位(我意识到非常小),那么p和q应该是最大16位的随机素数吗?
感谢您的任何澄清
罗布
答案 0 :(得分:15)
对于32位模数,问题有点学术性:选择p
和q
的主要目的是使产品难以分解,但找到较小数量的素数因子分解比2^32
更容易让人担心p
和q
在这种情况下的大小。请注意,只要p
和q
是不同的素数,数学就会正常工作。
对于更真实的东西,比如1024位模数,那么是的,您可以随意选择两个512位素数p
和q
:即选择{{1 }}和p
统一来自q
范围内所有素数的集合。有一个“strong primes”概念,它是旨在避免特定可能的已知攻击的素数 - 例如,您会看到应该选择[2^511, 2^512]
和p
的建议,以便q
和p-1
有很多因素,以防止使用Pollard's 'p-1' algorithm进行简单的分解。但是,这些建议并不适用于大模量和最先进的分解算法(GNFS,ECM)。还有其他一些可能的情况,理论上可以给出一个简单的因子分解,但实际上它们不太可能在q-1
和p
的随机选择中出现,他们不值得担心。 / p>
总结:只需选择两个具有相同位长的随机素数,就完成了。
要考虑的其他一些评论和事项:
当然,如果你确实选择了两个512位素数,你最终会得到 1023位或 1024位模数;这可能不值得担心,但如果你真的关心获得1024位模数,你可以进一步限制q
和p
的范围,比如q
,或者只是抛弃任何1023位模数,然后再试一次。
不要刻意选择[1.5 * 2^511, 2^512]
和p
,以便它们彼此靠近:q
和p
真正相互靠近(例如,相隔少于q
,那么他们的产品10^10
很容易被Fermat's method分解。但是,如果您在pq
范围内选择随机素数p
和q
,则不会发生任何现实概率。
在随机选择素数时,一个诱人的策略是在[2^511, 2^512]
范围内选择一个随机(奇数)整数,然后递增它直到找到第一个素数。但请注意,不在所有素数中做出统一选择:在大差距之后出现的素数比其他素数更有可能出现。一个更好的策略就是继续挑选随机奇数并保持第一个是素数(或者更可能的是,这么多随机选择的基数的强可能素数,你可以在实践中确定它是素数)。
确保您有一个非常好的随机数加密源,供您的素数生成。