我以RSA为例。几周前,它似乎运行良好。
但是,现在,密钥的生成需要很长时间(> 10秒)。我将其范围缩小:
import "crypto/rand"
p, _ := rand.Prime(rand.Reader, 3072)
为什么要花大量时间?
最佳答案
根据 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位素数的确确实会很慢(在我的机器上也要花费几秒钟)。