为了账号安全,请及时绑定邮箱和手机立即绑定

解析 Go 中使用 openssl 生成的 curve25519 键

解析 Go 中使用 openssl 生成的 curve25519 键

Go
芜湖不芜 2023-07-26 17:26:46
使用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。
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

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

您可以通过使用encoding/asn1库来解码密钥来“正确”地完成此操作,但在这种情况下,有一种更简单的方法。

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

所以你可以这样做:

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

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


查看完整回答
反对 回复 2023-07-26
?
慕神8447489

TA贡献1780条经验 获得超1个赞

由于之前的制表符/空格,您的内联键值格式不正确-----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 解析 PKI 错误:x509:未知的公钥算法


查看完整回答
反对 回复 2023-07-26
  • 2 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信