2017-06-21 163 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