Разбор ключей curve25519, сгенерированных с использованием openssl в Go

С помощью OpenSSL версии 1.1 и выше, я могу сгенерировать ключ curve25519:

openssl genpkey -algorithm x25519

Это создает закрытый ключ в форме:

-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VuBCIEIDgk3GuFMIaUJd3m95jn/Z8oU+cK9FzPoidIDn/bqRlk
-----END PRIVATE KEY-----

Я хочу проанализировать этот ключевой файл в Go и потенциально использовать его с помощью https://godoc.org/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 ответа

Решение

Поскольку в настоящее время нет возможности проанализировать ключи X25519 в стандартной библиотеке, возможно, вам придется сделать это "вручную".

Вы могли бы сделать это "правильно", используяencoding/asn1библиотека для декодирования ключей, но в этом случае есть более простой способ.

Оказывается, как для закрытого, так и для открытого ключа фактический ключ - это всего лишь последние 32 байта декодированного base64 блока ключа.

Итак, вы можете просто сделать:

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

Это будет работать как для открытых, так и для закрытых ключей и даст вам 32 байта []byte содержащий соответствующий ключ.

Значение вашего встроенного ключа неверно из-за табуляции / пробелов перед -----END PUBLIC KEY-----

Как результат block является nil и вызовет 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 функция не распознает этот ключевой алгоритм.

2009/11/10 23:00:00 Ошибка синтаксического анализа PKI: x509: неизвестный алгоритм открытого ключа

Другие вопросы по тегам