Golang 提取 ECDH 私钥

2024年 2月 13日 29.9k 0

golang 提取 ecdh 私钥

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)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论