Algorithm 随机素数

Algorithm 随机素数,algorithm,random,numbers,primes,Algorithm,Random,Numbers,Primes,我如何快速生成一个随机素数,当然是1024位长 使用库函数,如OpenSSL。没有必要自己写这个 示例:要以内存换取速度,只需生成内存并将其存储在列表中,然后随机选择一个即可 编辑: 当然,你不能全部生成它们,所以你能达到的最好效果就是以高内存成本实现伪随机性。此外,如果你想安全起见,这也不好。1024是很多。 你确定概率素数不行吗? 概率素数生成器是JDK的一部分 生成1024个随机位。使用强度足以满足预期目的的随机源 将最高和最低位设置为1。这样可以确保没有前导零(质数候选者足够大),并且它

我如何快速生成一个随机素数,当然是1024位长

使用库函数,如OpenSSL。没有必要自己写这个


示例:

要以内存换取速度,只需生成内存并将其存储在列表中,然后随机选择一个即可

编辑: 当然,你不能全部生成它们,所以你能达到的最好效果就是以高内存成本实现伪随机性。此外,如果你想安全起见,这也不好。

1024是很多。 你确定概率素数不行吗? 概率素数生成器是JDK的一部分

  • 生成1024个随机位。使用强度足以满足预期目的的随机源

  • 将最高和最低位设置为1。这样可以确保没有前导零(质数候选者足够大),并且它不是偶数(绝对不是质数)

  • 。如果不是素数,回到1

  • 或者,使用库函数为您生成素数。

    在:

    如果您想在“库模式”下执行此操作

    #包括
    // ...
    随机素数(mkvec2(int2u(1023),int2u(1024)))
    
    您没有指定上下文/语言/平台。。如果您想使用UNIX/Linux类似的Shell和Shell,可以考虑一个涉及OpenSSL版本>= 1.0.0:< /P>的解决方案。
    $ openssl prime -generate -bits 1024
    140750877582727333214379261853877378646889234118675380673028200387281415297520423589261211081966230040412916644372766351028035798201654335110081318739796178745233127842988596480299276295476504358587725867882394416543075082108266054273016211760684113070285409887820598314292803190900634009988950624354964653677
    
    如果你得到了同样的结果,那么宇宙就出了问题


    如果您喜欢十六进制,请添加
    -hex
    选项。

    “生成它们”?全都是!?!如果出于安全原因需要素数,这将不是一个好主意,通常情况下也是如此。马克:除了实际存储所有1024位素数的明显问题外,问题出在哪里?你无论如何都会选择一个随机素数。约翰尼斯:把它们都存储起来?我没想到乔纳斯是这个意思。我想他是指存储其中的一些小子集,然后随机选择一个。如果这些素数用于加密,这将打开一个巨大的安全漏洞。你的意思是绝对绝对素数,还是最有可能用于所有实际用途的素数?这些素数是用于安全目的还是其他用途?@Mark_Byers我在用Ruby。是的,这是出于安全目的。我正在尝试做一个RSA加密。你只是想教自己如何做,还是将它用于真正的安全敏感应用程序?如果您希望安全,那么最好使用OpenSSL库for Ruby(参见这里的示例),而不是自己尝试重新实现它。-1,我认为您在说伪素数时建议使用概率素数生成器。伪素数不是素数(即它有除1和它本身以外的因子),尽管它与素数有某些共同的性质,而且伪素数不能代替素数,特别是在密码学中。通过概率测试的伪素数很少,这一事实使得这种测试适用于随机生成的大数。但说老年退休金计划的需求可能由伪素数来满足显然是错误的。Java有一个概率素数检查/生成器,这很可能就是您的意思。@Glex:那么请编辑您的答案,使其不会产生误导。或者-阅读素数分布,以确保此算法是可行的(即不需要数万亿次尝试)它不需要几万亿次的尝试:素数的密度大约为1英寸(x)。在本例中,710取1,但因为他避免了偶数305取1。除非你使用一个非平凡的素数测试,否则它将需要数万亿次的试验来证明它是素数。如果你需要一个非平凡的素性测试,我不清楚你为什么不使用非平凡的方法来产生更好的候选人。谢谢,这是一个初步的想法。虽然我想知道是否有更快的解决方案。“将最高(和最低)位设置为1。这确保了(没有前导零)主要候选位足够大”-但这使它不是随机的,对吗?这不是缩小了容许值的范围吗?或者问题是隐含的(我不是安全/加密专家)“如何生成大于2^1023+1(或大于X)的1024位随机素数”?是的,您会丢失两位随机性。因此,您可以从1024位开始,在“1”前面加上一个“1”,生成一个1024位随机数的1026位数字。当然,这对这个星球上制造的大多数机器来说都有点麻烦。实际上,没有人会担心失去两个随机性。
    $ openssl prime -generate -bits 1024
    140750877582727333214379261853877378646889234118675380673028200387281415297520423589261211081966230040412916644372766351028035798201654335110081318739796178745233127842988596480299276295476504358587725867882394416543075082108266054273016211760684113070285409887820598314292803190900634009988950624354964653677