Синтаксический анализ кривой25519 ключей, созданных с помощью openssl в Go - PullRequest
0 голосов
/ 01 октября 2019

Используя OpenSSL версию 1.1 и более поздние, я могу сгенерировать ключ кривой25519:

openssl genpkey -algorithm x25519

При этом создается закрытый ключ в форме:

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

Я хочу проанализировать этот ключевой файл в Go и потенциально использовать его, используя golang.org / x / crypto / nacl / box . Глядя на документацию crypto / x509 , я не могу найти функцию синтаксического анализа, которая анализирует кривая25519. У кого-нибудь есть идея?

Я пытался:

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 ]

1 голос
/ 03 октября 2019

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

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

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

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

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

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

0 голосов
/ 01 октября 2019

Ваше значение встроенного ключа является неправильным из-за табуляции / пробелов перед -----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: неизвестный алгоритм открытого ключа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...