【问题标题】:Use secp256k1 in Go在 Go 中使用 secp256k1
【发布时间】:2018-09-03 15:20:09
【问题描述】:

我正在尝试将 Go 中的椭圆曲线 secp256k1 与库“crypto/x509”一起使用。生成密钥对后,分别得到公钥pubKey和私钥privKey。之后,我想生成一个包含公钥的证书,但在我想将私钥存储在 .pem 文件之前:

keyDer, err := x509.MarshalECPrivateKey(privKey)
    if err != nil {
        log.Fatalf("Failed to serialize ECDSA key: %s\n", err)
    }

但是当我尝试将 EC 私钥编组为 ASN.1、DER 格式并编译代码时,我收到一条错误消息:

ECDSA 密钥序列化失败:x509:未知椭圆曲线

在这种情况下,我必须使用该特定曲线,因此我无法更改为 prime256v1 或“类似曲线”。是否有解决方案允许在 crypto/x509 库中添加对 secp256k1 的支持,或其他方式/建议?

【问题讨论】:

  • 你是如何生成密钥的?
  • @VictorOliveira 我正在使用库:github.com/btcsuite/btcutil/hdkeychain。我将密钥生成为: privKey, err := hdkeychain.NewMaster(seed, &chaincfg.MainNetParams) //EC Private Key sKey, err := privKey.ECPrivKey() 最后作为问题的代码:keyDer, err := x509.MarshalECPrivateKey(privKey.ToECDSA())
  • 为什么不直接使用 secp256k1 C 库。您仍然可以使用 cgo 进行编译。
  • 我使用了这个github.com/sour-is/koblitz,然后从x509.ParseCertificate()开始克隆Golang x509包并解析所有依赖项。注意:无论如何我都不隶属于 lib
  • @trung 是否有一个公共存储库可以找到您修改后的 x509 包?

标签: go cryptography certificate bitcoin


【解决方案1】:

There is no secp256k1 curve type in go.

您是如何创建密钥对的?

我遇到了这个问题。在我的例子中,我使用了go-ethereum 包来创建这种曲线类型。所以,我使用同一个包的function 来解析密钥。

所以你必须使用同一个包的指定函数来解析密钥对。

这个 x509.MarshalECPrivateKey(privKey) 只会对 Marshal go 的标准曲线类型有所帮助。

【讨论】:

    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多