-2
我以實現RSA爲例。幾個星期前,它似乎工作正常。rand.Prime(rand.Reader,3072)需要很長時間才能執行
然而,現在,鍵的生成需要很長時間(> 10秒)。我已經縮小到線:
import "crypto/rand"
p, _ := rand.Prime(rand.Reader, 3072)
爲什麼這會花費大量的時間?
我以實現RSA爲例。幾個星期前,它似乎工作正常。rand.Prime(rand.Reader,3072)需要很長時間才能執行
然而,現在,鍵的生成需要很長時間(> 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)
}
即便如此,試圖產生3000位的素數確實出現了天生就慢(把我的機器上也幾秒鐘)由於素性測試的成本,如詹姆斯·諾克斯·波爾克建議。
爲什麼?你認爲應該花多長時間?像Miller-Rabin這樣的概率素性測試必須執行許多次數模冪運算。它非常昂貴,素數的分佈意味着它有時會很快找到一個素數,有時需要更長的時間。 –