我尝试使用 Go 的 rsa 和 x509 包生成一对 PKCS8 编码的私钥和相应的 PKCS1 编码的公钥。我希望具有与以下 openssl 命令相同的行为:
$ openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
$ openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
我在下面添加了我的 Go 实现,归结为要点。为了使用它,我首先使用GeneratePrivateKey生成一个私钥(最后附上的示例的位大小为2048),然后使用以下两种方法对私钥和公钥进行编码。
但是,当运行第二个 openssl 命令以在由我的 Go 实现编码的私钥上对公钥进行编码时,公钥不同(我在下面提供了一个差异示例)。特别是,它看起来好像 openssl 输出通过前缀扩展了我的 Go 实现的输出。
我将不胜感激对差异的任何解释(在最好的情况下,我将如何修复我的代码)。非常感谢你!
我的 Go 代码如下所示:
package xyz
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
)
func GeneratePrivateKey(bitSize int) (*rsa.PrivateKey, error) {
privateKey, err := rsa.GenerateKey(rand.Reader, bitSize)
if err != nil {
return nil, err
}
err = privateKey.Validate()
if err != nil {
return nil, err
}
return privateKey, nil
}
func EncodePrivateKeyToPEM(privateKey *rsa.PrivateKey) (string, error) {
privateDER, err := x509.MarshalPKCS8PrivateKey(privateKey)
if err != nil {
return "", err
}
privateBlock := pem.Block{
Type: "RSA PRIVATE KEY",
Headers: nil,
Bytes: privateDER,
}
privatePEM := pem.EncodeToMemory(&privateBlock)
return string(privatePEM), nil
}
慕盖茨4494581
相关分类