2015-09-06 192 views
-2

我以實現RSA爲例。幾個星期前,它似乎工作正常。rand.Prime(rand.Reader,3072)需要很長時間才能執行

然而,現在,鍵的生成需要很長時間(> 10秒)。我已經縮小到線:

import "crypto/rand" 

p, _ := rand.Prime(rand.Reader, 3072) 

爲什麼這會花費大量的時間?

+4

爲什麼?你認爲應該花多長時間?像Miller-Rabin這樣的概率素性測試必須執行許多次數模冪運算。它非常昂貴,素數的分佈意味着它有時會很快找到一個素數,有時需要更長的時間。 –

回答

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) 
} 

即便如此,試圖產生3000位的素數確實出現了天生就慢(把我的機器上也幾秒鐘)由於素性測試的成本,如詹姆斯·諾克斯·波爾克建議。