解析在 Go 中使用 openssl 生成的 curve25519 键
Parse curve25519 keys generated using openssl in Go
使用 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. Looking at 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
。
由于 -----END PUBLIC KEY-----
之前的 tab/spaces,您的内联键值格式不正确
结果block
是nil
并导致后续函数出现段错误。
这里是解码部分的快速修复:
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
由于目前无法在标准库中解析 X25519 密钥,您可能必须“手动”执行此操作。
你可以通过using the encoding/asn1
library to decode the keys“正确地”做到这一点,但在这种情况下有一个更简单的方法。
事实证明,对于私钥和 public 密钥,实际密钥只是密钥的 base64 解码块的最后 32 个字节。
所以你可以这样做:
block, _ := pem.Decode([]byte(pemString))
key := block.Bytes[len(block.Bytes)-32:]
这对 public 和私钥都有效,并且会给你一个包含适当密钥的 32 字节 []byte
。
使用 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. Looking at 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
。
由于 -----END PUBLIC KEY-----
结果block
是nil
并导致后续函数出现段错误。
这里是解码部分的快速修复:
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
由于目前无法在标准库中解析 X25519 密钥,您可能必须“手动”执行此操作。
你可以通过using the encoding/asn1
library to decode the keys“正确地”做到这一点,但在这种情况下有一个更简单的方法。
事实证明,对于私钥和 public 密钥,实际密钥只是密钥的 base64 解码块的最后 32 个字节。
所以你可以这样做:
block, _ := pem.Decode([]byte(pemString))
key := block.Bytes[len(block.Bytes)-32:]
这对 public 和私钥都有效,并且会给你一个包含适当密钥的 32 字节 []byte
。