簡體   English   中英

解析使用 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使用它。 查看crypto/x509文檔,我找不到解析curve25519的解析function。 有人有想法嗎?

我試過了:

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:]

這對公鑰和私鑰都有效,並且會給你一個 32 字節的[]byte包含適當的密鑰。

由於-----END PUBLIC KEY-----之前的制表符/空格,您的內聯鍵值不正確

結果blocknil ,導致后續function出現segfault。

這是解碼部分的快速修復:

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 function 無法識別此密鑰算法。

2009/11/10 23:00:00 Parse PKI Error: x509: unknown public key algorithm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM