1

使用OpenSSL1.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

4

2 回答 2

1

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

您可以通过使用encoding/asn1库对密钥进行解码来“正确”地做到这一点,但在这种情况下,有一种更简单的方法。

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

所以你可以这样做:

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

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

于 2019-10-02T21:46:12.147 回答
0

由于之前的制表符/空格,您的内联键值格式不正确-----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 Parse PKI Error: x509: unknown public key algorithm

于 2019-10-01T20:25:22.360 回答