如何从 PublicKey 生成字节数组

Fol*_*eah 4 cryptography go ecdsa

我正在使用crypto lib,遇到了一个问题:我需要将PublicKey类型转换为byte[],因为它可以使用私钥完成:

privkey.D.Bytes()
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

icz*_*cza 5

ecdsa.PrivateKey 是一个结构:

type PrivateKey struct {
        PublicKey
        D *big.Int
}
Run Code Online (Sandbox Code Playgroud)

所以privkey.D.Bytes()返回D大整数的字节。

同样,ecdsa.PublicKey

type PublicKey struct {
        elliptic.Curve
        X, Y *big.Int
}
Run Code Online (Sandbox Code Playgroud)

您可以对pubkey.Xpubkey.Y字段执行相同操作。这些将为您提供 2 个单独的字节切片。如果您需要将它们合并为一个,则需要提出某种“格式”,例如pubkey.X.Bytes()使用 4 个字节对第一个切片(的结果)的长度进行编码,然后是第一个切片,然后是长度(4 个字节)再次)第二个切片,以及第二个切片本身。

最好是为此使用该elliptic.Marshal()功能:

func Marshal(curve Curve, x, y *big.Int) []byte
Run Code Online (Sandbox Code Playgroud)

Marshal 将一个点转换为 ANSI X9.62 第 4.3.6 节中指定的未压缩形式。

使用示例:

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

data := elliptic.Marshal(pubkey, pubkey.X, pubkey.Y)
Run Code Online (Sandbox Code Playgroud)