Golang中ECDH的支持与实现

Golang中ECDH的支持与实现 Go语言是否有支持ECDH的包?

8 回复

所链接的两个库似乎都是用纯Go语言实现的。

更多关于Golang中ECDH的支持与实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我确实遇到过这个,但 golang/go 中有相关内容吗?我们正在寻找仅使用 golang/go 的解决方案。

老实说……我通常更倾向于使用外部解决方案,因为这样在出现bug时我可以更新库,而不必更新整个工具链!

我认为他问的是标准库中的实现。遗憾的是,你在那里找不到类似的东西。

标准库中出现的bug对你来说有多频繁地成为问题? 微笑表情

虽然我并没有遇到过这种情况,但这是我们评审团队经常提出的一个顾虑,我已经习惯了这一点并遵循这个原则。

尽管如此,我仍然会权衡。如果我必须在标准库和一个老旧库之间做出选择,而这个库的跟踪器里问题堆积如山却没有任何维护者回应,那么我的选择是显而易见的……不过,如果这个库是积极维护的,我可能会更倾向于选择它而不是标准库。

是的,Go语言标准库的crypto/ecdh包提供了对椭圆曲线Diffie-Hellman(ECDH)的原生支持。该包从Go 1.20版本开始引入,支持P-256、P-384、P-521等常用椭圆曲线。

以下是使用示例:

package main

import (
    "crypto/ecdh"
    "crypto/rand"
    "fmt"
    "log"
)

func main() {
    // 选择P-256曲线
    curve := ecdh.P256()
    
    // 生成Alice的密钥对
    privateKeyAlice, err := curve.GenerateKey(rand.Reader)
    if err != nil {
        log.Fatal(err)
    }
    publicKeyAlice := privateKeyAlice.PublicKey()
    
    // 生成Bob的密钥对
    privateKeyBob, err := curve.GenerateKey(rand.Reader)
    if err != nil {
        log.Fatal(err)
    }
    publicKeyBob := privateKeyBob.PublicKey()
    
    // Alice计算共享密钥
    sharedSecretAlice, err := privateKeyAlice.ECDH(publicKeyBob)
    if err != nil {
        log.Fatal(err)
    }
    
    // Bob计算共享密钥
    sharedSecretBob, err := privateKeyBob.ECDH(publicKeyAlice)
    if err != nil {
        log.Fatal(err)
    }
    
    // 验证双方计算的共享密钥是否相同
    fmt.Printf("共享密钥匹配: %v\n", 
        string(sharedSecretAlice) == string(sharedSecretBob))
    fmt.Printf("共享密钥长度: %d bytes\n", len(sharedSecretAlice))
}

对于Go 1.20之前的版本,可以使用golang.org/x/crypto中的相关包:

import "golang.org/x/crypto/curve25519"

crypto/ecdh包提供了类型安全的API,支持以下曲线:

  • ecdh.P256():NIST P-256曲线
  • ecdh.P384():NIST P-384曲线
  • ecdh.P521():NIST P-521曲线
  • ecdh.X25519():Curve25519曲线

该包还支持密钥序列化和反序列化:

// 序列化公钥
publicKeyBytes := publicKey.Bytes()

// 从字节反序列化公钥
publicKey, err := curve.NewPublicKey(publicKeyBytes)
if err != nil {
    log.Fatal(err)
}
回到顶部