如何从PublicKey生成字节数组

时间:2018-09-25 16:09:50

标签: go cryptography ecdsa

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

privkey.D.Bytes()

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

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

最好为此使用elliptic.Marshal()函数:

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

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

使用示例:

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

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

答案 1 :(得分:0)

对于在ed25519/crypto方面寻求解决方案的可爱的人们。我撞了将近3个小时,直到发现:

func getPrivateKey() ed25519.PrivateKey {
    // TODO You fill in this one
}

func main() {
    prvKey := getPrivateKey() // Get the private key

    pubKey := prvKey.Public().(ed25519.PublicKey)
    if !ok {
        log.Errorf("Could not assert the public key to ed25519 public key")
    }
    pubKeyBytes := []byte(pubKey)
}

答案 2 :(得分:0)

ECDSA 公钥具有下面定义的结构类型。

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

//Getting the ECDSA public key type from the X509 certificate
pub := certificate.PublicKey.(*ecdsa.PublicKey)

要将公钥转换为字节数组,请使用“crypto/elliptic”包 M​​arshal Marshal 将点转换为 ANSI X9.62 的第 4.3.6 节中指定的形式。

pubKeyByte := elliptic.Marshal(pub, pub.X, pub.Y)