【问题标题】:Parse curve25519 keys generated using openssl in Go在 Go 中解析使用 openssl 生成的 curve25519 键
【发布时间】:2019-10-01 19:50:41
【问题描述】:

使用OpenSSL 1.1 或更高版本,我能够生成curve25519 密钥:

openssl genpkey -algorithm x25519

这会产生如下形式的私钥:

-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VuBCIEIDgk3GuFMIaUJd3m95jn/Z8oU+cK9FzPoidIDn/bqRlk
-----END PRIVATE KEY-----

我想在 Go 中解析这个密钥文件,并可能使用 golang.org/x/crypto/nacl/box 来使用它。查看crypto/x509 文档,我找不到解析curve25519 的解析函数。有人有想法吗?

我试过了:

pKey := `-----BEGIN PUBLIC KEY-----
MCowBQYDK2VuAyEAfLLsWKkI/7EmTOkSf4fyHuRHDnKk6qNncWDzV8jlIUU=
-----END PUBLIC KEY-----`

block, _ := pem.Decode([]byte(pKey))
key, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
    fmt.Println(err)
}

我收到错误unknown public key algorithm

【问题讨论】:

  • 仅供参考...您的生成密钥输出具有 PRIVATE KEY 但您的代码 sn-p 使用 PUBLIC KEY

标签: go openssl curve-25519


【解决方案1】:

由于目前无法在标准库中解析 X25519 密钥,您可能必须“手动”执行此操作。

你可以通过using the encoding/asn1 library to decode the keys“正确”地做到这一点,但在这种情况下有一个更简单的方法。

事实证明,对于私钥和公钥,实际密钥只是密钥的 base64 解码块的最后 32 个字节。

所以你可以这样做:

block, _ := pem.Decode([]byte(pemString))
key := block.Bytes[len(block.Bytes)-32:]

这将适用于公钥和私钥,并会为您提供一个包含适当密钥的 32 字节 []byte

【讨论】:

    【解决方案2】:

    由于-----END PUBLIC KEY----- 之前的制表符/空格,您的内联键值格式不正确

    因此blocknil 并导致后续函数出现段错误。

    这是解码片段的快速修复:

    pKey := `-----BEGIN PRIVATE KEY-----
    MCowBQYDK2VuAyEAfLLsWKkI/7EmTOkSf4fyHuRHDnKk6qNncWDzV8jlIUU=
    -----END PRIVATE KEY-----`
    
    block, _ := pem.Decode([]byte(pKey))
    
    if block == nil || block.Type != "PRIVATE KEY" {
        log.Fatal("failed to decode PEM block containing private key")
    
    }
    
    key, err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        log.Println("Parse PKI Error:", err)
        return
    }
    

    游乐场:https://play.golang.org/p/O2wk8rmKGWH

    注意:ParsePKIXPublicKey 函数无法识别此密钥算法。

    2009/11/10 23:00:00 解析 PKI 错误:x509:未知公钥 算法

    【讨论】:

    • 抱歉,StackOverFlow 的编辑器未能正确格式化我的标签。我已经解决了这个问题。问题仍然存在。没有识别curve25519的解析函数。
    • 我认为您需要澄清 PublicPrivate - 有问题的功能是针对公钥的 - 您的问题有私钥定义。
    • 我的示例中的密钥是公钥,我用来解析它的函数是公钥。这个问题与它是公钥还是私钥无关。也没有可以解析的函数。
    • 相关。私钥包含私有部分和公共部分。公钥只是公共部分。 OpenSSL 有这个区别,x509 包也有。
    • 我明白这一点。但是x509 包下没有解析私钥或公钥文件的函数。 ParsePKIXPublicKey 不是正确的函数。
    猜你喜欢
    • 2019-03-08
    • 2012-04-11
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多