Как сгенерировать массив байтов из PublicKey - PullRequest
0 голосов
/ 25 сентября 2018

Я использую crypto lib , столкнулся с проблемой: мне нужно преобразовать тип PublicKey в byte[], как это можно сделать с помощью закрытого ключа:

privkey.D.Bytes()

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 25 сентября 2018

ecdsa.PrivateKey является структурой:

type PrivateKey struct {
        PublicKey
        D *big.Int
}

Итак, privkey.D.Bytes() возвращает вам байты D большого целого числа.

Аналогично, ecdsa.PublicKey:

type PublicKey struct {
        elliptic.Curve
        X, Y *big.Int
}

Вы можете сделать то же самое с полями pubkey.X и pubkey.Y.Это даст вам 2 отдельных байта.Если вам нужно объединить их в один, вам нужно придумать какой-то «формат», например, кодировать длину первого среза (результат pubkey.X.Bytes()), используя 4 байта, затем первый срез, затем длину(Еще 4 байта) второго среза и самого второго среза.

Лучше всего использовать для этого функцию elliptic.Marshal():

func Marshal(curve Curve, x, y *big.Int) []byte

Маршал преобразует точку в несжатую форму, указанную в разделе 4.3.6 стандарта ANSI X9.62.

Пример ее использования:

var pubkey *ecdsa.PublicKey = // ...

data := elliptic.Marshal(pubkey, pubkey.X, pubkey.Y)
...