2017-06-21 54 views
2

crypto/rsa庫具有以下函數來生成新的RSA私鑰。使用特定的公開指數生成RSA密鑰

func GenerateKey(random io.Reader, bits int) (*PrivateKey, error) 

這似乎默認使用65537作爲公共指數值。有沒有一個API可以用來生成一個RSA私鑰,其中有一個我選擇的公共指數,它不依賴於OpenSSL或其他C庫?

+0

@tweaksp#1即鏈接是一個SHA-1攻擊。這與RSA無關。 #2當使用適當的填充模式時,與使用小指數相關的攻擊不起作用。 #3我有很多理由希望這樣做,包括但不限於與其他系統互操作並編寫測試工具。 – Ayrx

+0

糟糕,無意中複製了錯誤的鏈接!修復:) – tweaksp

+0

不,指數是在生成函數中硬編碼的,您可以在這裏看到完整的公共API:https://golang.org/pkg/crypto/rsa/。 GenerateMultiPrimeKey函數是自包含的,您可以將其複製到源代碼中並進行修改。 – JimB

回答

1

在Go中不會找到這樣的API。

這是因爲,由於許多原因,3和65537匹配RSA工作所需的條件和RSA實現要求的速度。

下面是這兩個屬性的解釋:

  • 首先,RSA工作,公用指數必須用整數集的基數互爲素,1和模量,即與模數相互矛盾(參見RSA算法來理解爲什麼)。所以,選擇一個素數是一個很好的方法來讓這個數字與上述集合的基數相互衝突,這就是爲什麼大多數時候人們選擇素數作爲公衆指數的原因(如果它是不是這種情況,他們計算一個新的模數而不是改變公共指數)。由於上述集合的基數是偶數,因此不能選擇2(如果模數是素數p和q的乘積,則該集合具有(p-1)(q-1)個元素,顯然這是一個偶數數)。

  • 此外,爲了快速計算,公開指數的二進制表示中設置爲1的位數必須儘可能低。 2是其二進制表示中唯一一位設置爲1的素數。由於它不能被選擇,所以你會選擇一個只有2位在其二進制表示中被設置爲1的素數。因此,任何其他數的這種素數的算術乘積只需要一個加法和一個邏輯左移。

唯一已知的整數(到現在)符合這些要求是3,5,17,257和65537