go - 在 Go 中解析使用 openssl 生成的 curve25519 键
问题描述
使用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
。
解决方案
由于目前无法在标准库中解析 X25519 密钥,因此您可能必须“手动”执行此操作。
您可以通过使用encoding/asn1
库对密钥进行解码来“正确”地做到这一点,但在这种情况下,有一种更简单的方法。
事实证明,对于私钥和公钥,实际密钥只是密钥的 base64 解码块的最后 32 个字节。
所以你可以这样做:
block, _ := pem.Decode([]byte(pemString))
key := block.Bytes[len(block.Bytes)-32:]
这适用于公钥和私钥,并会为您提供一个[]byte
包含适当密钥的 32 字节。
推荐阅读
- firebase - Firestore createId() id 不按时间顺序排列
- r - 创建具有特定时期变量年增长的新数据框
- python - 烧瓶套接字 io 不工作(Windows 7 和 10)anaconda 和 python 3.7
- c# - 在不同机器上使用 MSBuild.exe 构建时的差异
- php - 当我使用移动功能php添加登录时无法登录
- c# - SSIS的脚本任务中可以省略Dts.TaskResult吗
- ios - 在 ios swift voicememo 应用程序中重新录制音频
- python - 调试 python 云堆栈模块中可能存在的错误的 ansible 跟踪
- javascript - 使 jquery datepicker 每年在相同的日期日期使用不同的颜色
- java - VisualVM - 我如何连接?