微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我应该为密码安全素数使用Rabin-Miller多少次迭代?

如何解决我应该为密码安全素数使用Rabin-Miller多少次迭代?

| 我正在为Diffie-Hellman类型的密钥p生成2048位安全质数,使得p和(p-1)/ 2均为质数。 我可以在p和(p-1)/ 2上使用几次rabin-Miller迭代,并且仍然对密码强的密钥充满信心?在完成的研究中,我听到了1024位普通质数从6到64次迭代的所有内容,因此在这一点上我有些困惑。一旦确定,如果您生成的是安全的素数而不是普通的素数,数字是否会改变? 计算时间非常宝贵,所以这是一个实际的问题-我基本上想知道如何找出我可以避免的最低测试数量,同时又要保证相当多的安全性。     

解决方法

        假设您通过选择随机值来选择素数p,直到您遇到Miller-Rabin所说的值为止:一个看起来像素数。 Miller-Rabin测试最多使用n个回合。 (对于所谓的“安全素数”,除非您运行两个嵌套测试,否则不会更改任何内容。) 随机的1024位整数是质数的概率约为1/900。现在,您不想做任何愚蠢的事情,因此只生成奇数值(保证偶数1024位整数是非素数),并且更普遍的是,仅当值不是\时才运行Miller-Rabin测试显然是非素数,即可以除以一个小素数。因此,您最终会在达到质数之前(平均)尝试使用Miller-Rabin尝试约300个值。如果该值是非质数,则Miller-Rabin会在每个回合中以3/4的概率检测到该值,因此,对于一个非质数值,平均要运行的Miller-Rabin回合数为1+(1/4 )+(1/16)+ ... = 4/3。对于300个值,这意味着无论您为n选择什么,大约需要进行400轮Miller-Rabin。 因此,如果您选择n为例如40,则n隐含的成本小于总计算成本的10%。随机素数选择过程受非素数测试的支配,这些非素数不受所选n值的影响。我在这里谈到了1024位整数。对于较大的数字,n的选择甚至没有那么重要,因为质数随着大小的增加而变得稀疏(对于2048位整数,上方的“ 10%”变为“ 5%”)。 因此,您可以选择n = 40并对此感到满意(或者至少知道减少n不会给您带来多少好处)。另一方面,使用大于40的n是没有意义的,因为这会使您获得的概率低于简单计算错误的风险。计算机是硬件,它们可能会随机出现故障。例如,素数测试函数可能会针对非素值返回“ true”,因为宇宙射线(高速冲刺宇宙的高能粒子)恰巧在正确的时间撞击了正确的晶体管,将返回值从0(\“ false \”)翻转为1(\“ true \”)。这是极不可能的-但可能性不小于2-80。有关更多详细信息,请参见此stackoverflow答案。底线是,无论您如何确保整数为素数,都仍然具有不可避免的概率元素,并且40轮Miller-Rabin已经为您提供了您可以期望的最好结果。 总结一下,使用40发子弹。     ,        该论文由Damgard-Landrock-Pomerance进行的强概率初等检验的平均情况误差估计指出,如果您随机选择bit0ѭ位奇数
n
,并相继应用ѭ2Ra个独立的Rabin-Miller检验,则
n
是复合的概率具有更强的界限。 实际上对于
3 <= t <= k/9
k >= 21
, 对于
k=1024
的质数,
t=6
迭代给出的错误率小于
10^(-40)
。     ,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次迭代:-)。     ,        从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     ,        我将运行Miller-Rabin测试(即强Fermat可能的质数)测试两到三个迭代,并确保基数之一为2。 然后,我将运行一个强大的Lucas可能的素数测试,并使用此处描述的方法选择D,P和Q: https://zh.wikipedia.org/wiki/Baillie%E2%80%93PSW_primality_test 没有已知的复合材料通过费马和卢卡斯测试的这种结合。 这比进行40次Rabin-Miller迭代要快得多。此外,正如Pomerance,Selfridge和Wagstaff在https://math.dartmouth.edu/~carlp/PDF/paper25.pdf中指出的那样,多次Fermat检验的收益递减:如果N是一个伪素数底数,那么比平均值更可能是其他底数的伪素数。例如,这就是为什么我们看到很多psp \的基数2也是psp \的基数3的原因。     ,        通常,较小的概率会更好,但我会把实际的概率值和一小撮盐结合起来。 Albrecht等人的《素数与偏见:对抗条件下的素数测试》打破了密码库中的许多素数测试例程。在一个示例中,发布的概率为1/2 ^ 80,但在16中,它们构造的数字被声明为素数1次。 在其他几个示例中,它们的数量会通过100%的时间。     ,        有关系吗?为什么不运行1000次迭代?搜索素数时,无论如何它都会在第一次失败时停止应用Rabin-Miller测试,因此对于找到素数而言,迭代次数的上限并不重要。在那1000次迭代之后,您甚至可以运行确定性素数检查算法,以完全确定。 也就是说,在n次迭代之后,一个数字为质数的概率为4 ^ -n。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。