Fol*_*eah 4 cryptography go ecdsa
我正在使用crypto lib,遇到了一个问题:我需要将PublicKey类型转换为byte[],因为它可以使用私钥完成:
privkey.D.Bytes()
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
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.X和pubkey.Y字段执行相同操作。这些将为您提供 2 个单独的字节切片。如果您需要将它们合并为一个,则需要提出某种“格式”,例如pubkey.X.Bytes()使用 4 个字节对第一个切片(的结果)的长度进行编码,然后是第一个切片,然后是长度(4 个字节)再次)第二个切片,以及第二个切片本身。
最好是为此使用该elliptic.Marshal()功能:
Run Code Online (Sandbox Code Playgroud)func Marshal(curve Curve, x, y *big.Int) []byteMarshal 将一个点转换为 ANSI X9.62 第 4.3.6 节中指定的未压缩形式。
使用示例:
var pubkey *ecdsa.PublicKey = // ...
data := elliptic.Marshal(pubkey, pubkey.X, pubkey.Y)
Run Code Online (Sandbox Code Playgroud)