Разбор ключей 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: неизвестный алгоритм открытого ключа