23

メソッドを使用してecdsa.GenerateKey、Go で秘密鍵と公開鍵のペアを生成しています。秘密鍵をユーザーのコンピューター上のファイルに保存し、プログラムが起動するたびにロードしたいと思います。公開鍵をマーシャリングする方法はありますがelliptic.Marshal、秘密鍵についてはありません。単に自分でロールする必要がありますか、または秘密キーを保存するための推奨される方法はありますか?

4

3 に答える 3

33

これは、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.")
    }
}
于 2016-12-24T17:24:23.977 に答える
9

これらのキーの標準形式は、X.509 ASN.1 DER 表現を使用することだと思います。http://golang.org/pkg/crypto/x509/#MarshalECPrivateKeyおよびhttp://golang.org/pkg/crypto/x509/#ParseECPrivateKeyを参照してください。

于 2014-03-06T04:10:35.710 に答える