rand.Prime(rand.Reader,3072)需要很长时间才能执行

时间:2015-09-06 18:56:26

标签: go

我以RSA为例。几周前,它似乎工作正常。

然而,现在,密钥的生成需要很长时间(> 10秒)。我把它缩小到了界限:

adressyr = urllib2.urlopen("WEBSITE")
soup = BeautifulSoup(adressyr, 'html.parser')
mydivs = soup.findAll("td", { "class" : "Player ID" })
print mydivs

为什么这需要花费大量时间?

1 个答案:

答案 0 :(得分:0)

除了进行素性测试的计算成本之外,根据crypto/rand文档,这些数字来自一个加密安全的伪随机数生成器"。这些随机性来源might be slow,取决于您的环境。

这可能是crypto/prime消费io.Reader的原因,因此我们可以为其提供另一个随机来源。 e.g.

package main

import (
    cRand "crypto/rand"
    "fmt"
    mRand "math/rand"
)

// Adapted from http://stackoverflow.com/questions/12771930/
type randReader struct {
    src mRand.Source
}

func newRandReader() *randReader {
    // FIXME: source the seed from crypto/rand instead.
    return &randReader{mRand.NewSource(42)}
}

func (r *randReader) Read(p []byte) (n int, err error) {
    for i := range p {
        p[i] = byte(r.src.Int63() & 0xff)
    }
    return len(p), nil
}

func main() {
    fmt.Println("Hello, playground")
    r := newRandReader()
    p, _ := cRand.Prime(r, 300)
    fmt.Println(p)
}

即便如此,正如James K Polk所暗示的,由于素性测试的成本,尝试生成3000位素数似乎确实很慢(在我的机器上也需要几秒钟)。