Я использую метод ecdsa.GenerateKey для создания пары private/public key в Go. Я хотел бы сохранить закрытый ключ в файле на компьютере пользователя и загрузить его всякий раз, когда запускается программа. Существует метод elliptic.Marshal, который марширует открытый ключ, но ничего для закрытого ключа. Должен ли я просто запускать свой собственный файл или есть рекомендуемый способ хранения закрытого ключа?
Как хранить закрытый ключ ECDSA в Go
Ответ 1
Я считаю, что стандартным форматом этих ключей является использование представления DSP X.509 ASN.1. См. http://golang.org/pkg/crypto/x509/#MarshalECPrivateKey и http://golang.org/pkg/crypto/x509/#ParseECPrivateKey.
Ответ 2
Вот пример кода, который демонстрирует кодирование и декодирование ключей в Go. Это помогает понять, что вам нужно подключить пару шагов. Криптоалгоритм - это первый шаг, в данном случае ключ ECDSA. Тогда вам нужна стандартная кодировка, x509 наиболее часто используется в стандарте. Наконец, вам нужен формат файла, PEM снова обычно используется. В настоящее время это наиболее часто используемая комбинация, но не стесняйтесь заменять любые другие алгоритмы или кодирование.
func encode(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey) (string, string) {
    x509Encoded, _ := x509.MarshalECPrivateKey(privateKey)
    pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: x509Encoded})
    x509EncodedPub, _ := x509.MarshalPKIXPublicKey(publicKey)
    pemEncodedPub := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: x509EncodedPub})
    return string(pemEncoded), string(pemEncodedPub)
}
func decode(pemEncoded string, pemEncodedPub string) (*ecdsa.PrivateKey, *ecdsa.PublicKey) {
    block, _ := pem.Decode([]byte(pemEncoded))
    x509Encoded := block.Bytes
    privateKey, _ := x509.ParseECPrivateKey(x509Encoded)
    blockPub, _ := pem.Decode([]byte(pemEncodedPub))
    x509EncodedPub := blockPub.Bytes
    genericPublicKey, _ := x509.ParsePKIXPublicKey(x509EncodedPub)
    publicKey := genericPublicKey.(*ecdsa.PublicKey)
    return privateKey, publicKey
}
func test() {
    privateKey, _ := ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
    publicKey := &privateKey.PublicKey
    encPriv, encPub := encode(privateKey, publicKey)
    fmt.Println(encPriv)
    fmt.Println(encPub)
    priv2, pub2 := decode(encPriv, encPub)
    if !reflect.DeepEqual(privateKey, priv2) {
        fmt.Println("Private keys do not match.")
    }
    if !reflect.DeepEqual(publicKey, pub2) {
        fmt.Println("Public keys do not match.")
    }
}
		Ответ 3
Я адаптировал очень быстрый и грязный способ сделать это, как это было предложено одной из команд geth в конце 15-го в моей библиотеке https://github.com/DaveAppleton/ether_go
это гораздо более простое решение (но ставит ключи на виду)