我正在为Diffie-Hellman类型密钥生成2048位安全素数,p使得p和(p-1)/ 2都是素数。
我可以在p和(p-1)/ 2上使用几次Rabin-Miller迭代,并且仍然对加密密钥有信心吗?在我做过的研究中,我已经听到了1024位普通素数的6到64次迭代的所有内容,所以我在这一点上有点困惑。一旦确定,如果你正在产生一个安全的素数而不是一个普通素数,那么数字是否会改变?
计算时间非常宝贵,所以这是一个实际问题 - 我基本上想知道如何找出尽可能少的测试数量,同时保持非常有保障的安全性。
答案 0 :(得分:26)
让我们假设你选择一个素数 p ,然后选择随机值,直到你找到米勒 - 拉宾所说的那个:那个看起来像素数。您最多使用 n 轮进行Miller-Rabin测试。 (对于所谓的“安全素数”,除了你运行两个嵌套测试外,事情都没有改变。)
随机1024位整数为素数的概率约为1/900。现在,你不想做任何愚蠢的事情,所以你只生成奇数值(一个偶数1024位整数保证非素数),更一般地说,你只运行Miller-Rabin测试如果该值不是“明显”非素数,即可以除以小素数。因此,在达到素数(平均)之前,你最终会尝试使用米勒 - 拉宾的300个值。当该值为非素数时,Miller-Rabin将在每一轮中以3/4的概率检测到它,因此,对于单个非素数值,您将平均运行的Miller-Rabin轮数为1+(1/4) )+(1/16)+ ... = 4/3。对于300个值,这意味着大约400轮Miller-Rabin,无论您选择 n 。
因此,如果您选择 n ,例如40,那么 n 所隐含的成本将低于总计算成本的10%。随机素数选择过程由非素数测试主导,非素数测试不受您选择的 n 值的影响。我在这里谈到了1024位整数;对于更大的数字, n 的选择更不重要,因为随着大小的增加,素数变得更稀疏(对于2048位整数,上面的“10%”变为“5%”)。
因此,您可以选择 n = 40 并对此感到满意(或者至少知道减少 n 无论如何都不会给您带来太多帮助)。另一方面,使用大于40的 n 是没有意义的,因为这会使您的概率低于简单错误计算的风险。计算机是硬件,它们可能有随机故障。例如,素数测试函数可以为非素值返回“真”,因为宇宙射线(高能粒子高速穿过宇宙)碰巧恰好在正确的时间点击正确的晶体管,翻转返回值从0(“false”)到1(“true”)。这是非常不可能的 - 但概率 2 -80 的可能性不小。有关详细信息,请参阅this stackoverflow answer。最重要的是,无论你如何确保一个整数是素数,你仍然有一个不可避免的概率元素,40轮米勒 - 拉宾已经给你最好的你想要的。
总结一下,使用40轮。
答案 1 :(得分:9)
Damgard-Landrock-Pomerance的论文Average case error estimates for the strong probable prime test指出,如果你随机选择k
- 位奇数n
并应用t
独立的Rabin-Miller测验相继而言,n
是复合的概率具有更强的界限。
实际上是3 <= t <= k/9
和k >= 21
,
对于k=1024
位素数,t=6
次迭代会使错误率低于10^(-40)
。
答案 2 :(得分:4)
Rabin-Miller的每次迭代都将数字复合的几率降低了1/4。
因此,在64次迭代之后,2 ^ 128中只有1次机会这个数字是复合的。
假设您将这些用于公钥算法(例如RSA),并假设您正在使用(比如说)128位密钥将其与对称算法相结合,那么攻击者可以猜测您的密钥有这种可能性。
最重要的是选择迭代次数,将该概率置于您为算法选择的其他尺寸的球场内。
[更新,详细说明]
答案完全取决于您将使用哪些算法,以及针对这些算法的最佳已知攻击。
例如,根据Wikipedia:
自2003年起,RSA Security声称1024位RSA密钥的强度与80位对称密钥相同,2048位RSA密钥与112位对称密钥相同,3072位RSA密钥与128位对称密钥相同。
因此,如果您计划使用这些素数来生成(比方说)1024位RSA密钥,那么就没有理由运行Rabin-Miller超过40次迭代。为什么?因为当你遇到故障时,攻击者无论如何都可以破解你的一个密钥。
当然,在时间允许的情况下,没有理由不执行更多迭代。这样做没有多少点。
另一方面,如果要生成2048位RSA密钥,那么Rabin-Miller的56次(或左右)迭代更合适。
加密通常构建为基元的组合,如素数生成,RSA,SHA-2和AES。如果你想制作比其他原始物质强2到900倍的原始物,你可以,但它有点像在一个小木屋上放一个10英尺长的钢拱门。
您的问题没有固定的答案。这取决于进入加密系统的其他部分的强度。
所有这一切,2 ^ -128是一个非常微小的概率,所以我可能只使用64次迭代: - )。
答案 3 :(得分:2)
来自libgcrypt源:
/* We use 64 Rabin-Miller rounds which is better and thus
sufficient. We do not have a Lucas test implementaion thus we
can't do it in the X9.31 preferred way of running a few
Rabin-Miller followed by one Lucas test. */
cipher / primegen.c第1295行
答案 4 :(得分:1)
我将运行两次或三次Miller-Rabin(即强Fermat可能的质数)测试,并确保基数之一为2。
然后,我将运行一个强大的Lucas可能的素数测试,并使用此处描述的方法选择D,P和Q: https://en.wikipedia.org/wiki/Baillie%E2%80%93PSW_primality_test
尚无已知的复合材料通过费马和卢卡斯测试的这种结合。
这比进行40次Rabin-Miller迭代要快得多。另外,正如https://math.dartmouth.edu/~carlp/PDF/paper25.pdf中Pomerance,Selfridge和Wagstaff所指出的那样,多次Fermat检验的收益递减:如果N是一个基数的假素数,那么它比平均数更可能是其他基础的伪素数。例如,这就是为什么我们看到很多psp的基数2也是psp的基数3。
答案 5 :(得分:0)
通常, 的概率较小,但我会把实际的概率值加一点盐。 Albrecht等人Prime and Prejudice: Primality Testing Under Adversarial Conditions打破了密码库中的许多主要测试例程。在一个示例中,发布的概率为1/2 ^ 80,但将其构造的数字声明为16中的1次素数。
在其他几个示例中,它们的数量通过了100%的时间。
答案 6 :(得分:-1)
重要吗?为什么不运行1000次迭代?在搜索素数时,你会在第一次失败时停止应用Rabin-Miller测试,所以在找到素数时所花费的时间并不重要,迭代次数的上限是多少。你甚至可以在1000次迭代之后运行一个确定性素性检查算法来完全确定。
也就是说,n次迭代后数是素数的概率是4 ^ -n。