php小编苹果为您带来Golang提取ECDH私钥的简洁攻略。ECDH是一种非对称加密算法,用于在两个通信方之间建立安全的密钥交换。在Golang中,提取ECDH私钥是实现安全通信的重要步骤之一。本文将介绍如何使用Golang编程语言提取ECDH私钥的详细步骤和注意事项,帮助您快速掌握这一关键技能。无论您是初学者还是有经验的开发者,本文都将为您提供有用的指导和实用的示例代码。让我们一起开始吧!
问题内容
我知道ECDH私钥是公钥的超集。任务是提取私钥ecdh。
生成PublicKey的方法如下:
import (
"crypto/ecdh"
"crypto/rand"
"crypto/ecdsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"fmt"
)
func main() {
alicePrivateKey, err := ecdh.P256().GenerateKey(rand.Reader)
alicePublicKey, err := MarshalECDHPublicKey(alicePrivateKey.PublicKey())
if err != nil {
fmt.Errorf("failed to marshal public key into PKIX format")
}
fmt.Printf("alicePubK => %sn", alicePublicKey)
clientECDSAPubKey, err := UnmarshalECDSAPublicKey(alicePublicKey)
if err != nil {
panic(err)
}
println(clientECDSAPubKey)
println("no error")
}
func MarshalECDHPublicKey(pk *ecdh.PublicKey) (string, error) {
ecdhSKBytes, err := x509.MarshalPKIXPublicKey(pk)
if err != nil {
return "", fmt.Errorf("failed to marshal public key into PKIX format")
}
ecdhSKPEMBlock := pem.EncodeToMemory(
&pem.Block{
Type: "PUBLIC KEY",
Bytes: ecdhSKBytes,
},
)
return base64.StdEncoding.EncodeToString(ecdhSKPEMBlock), nil
}
登录后复制
解决方法
我假设您想以 pem
格式提取 ecdh
私钥,就像使用公钥一样。从公钥中提取私钥是不可能的(计算上不可行)。我已经为您实现了 UnmarshalECDSAPublicKey
函数(最好重命名为 MarshalECDHPrivateKey
)
// MarshalPKCS8PrivateKey converts a private key to PKCS #8, ASN.1 DER form.
//
// The following key types are currently supported: *rsa.PrivateKey,
// *ecdsa.PrivateKey, ed25519.PrivateKey (not a pointer), and *ecdh.PrivateKey.
// Unsupported key types result in an error.
//
// This kind of key is commonly encoded in PEM blocks of type "PRIVATE KEY".
func UnmarshalECDSAPublicKey(alicePrivateKey *ecdh.PrivateKey) (string, error) {
ecdhSKBytes, err := x509.MarshalPKCS8PrivateKey(alicePrivateKey)
if err != nil {
return "", fmt.Errorf("failed to marshal private key into PKIX format")
}
ecdhSKPEMBlock := pem.EncodeToMemory(
&pem.Block{
Type: "PRIVATE KEY",
Bytes: ecdhSKBytes,
},
)
return string(ecdhSKPEMBlock), nil
}
登录后复制
正如其他人在有关 MarshalECDHPublicKey
函数的评论中指出的那样,您不需要使用 base64.StdEncoding.EncodeToString(ecdhSKPEMBlock)
再次编码,因为 pem.EncodeToMemory
会做同样的事情,您只需将其转换为字符串即可。
以上就是Golang 提取 ECDH 私钥的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!