答案 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.X
和pubkey.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”包 Marshal Marshal 将点转换为 ANSI X9.62 的第 4.3.6 节中指定的形式。
pubKeyByte := elliptic.Marshal(pub, pub.X, pub.Y)