Skip to content

ED25519 ​

ED25519 是一种基于椭圆曲线的数字签名算法,使用 Curve25519 椭圆曲线和 Edwards 坐标系。dongle 支持标准和流式 ED25519 数字签名,提供快速、安全的签名和验证功能。

ED25519 算法特点:

  • 高性能:签名和验证速度快,比传统 RSA 算法性能更优
  • 安全性高:使用 256 位椭圆曲线,提供相当于 3072 位 RSA 的安全强度
  • 密钥短小:公钥和私钥长度仅 32 字节,签名长度 64 字节
  • 抗侧信道攻击:算法设计天然抵抗定时攻击等侧信道攻击
  • 确定性签名:对相同数据的签名结果确定,便于测试和调试

注意事项:

  • 密钥格式:默认使用 PKCS#8 私钥与 SPKI/PKIX 公钥;设置密钥时也接受裸密钥材料(32 字节种子、64 字节私钥、32 字节公钥)以及 base64/hex 编码的 DER
  • 密钥长度:ED25519 使用固定长度的密钥,无需选择密钥长度
  • 哈希算法:ED25519 内置使用 SHA-512 哈希,无需额外指定哈希算法
  • 私钥安全:私钥必须妥善保管,不能泄露,只有私钥持有者才能生成有效签名
  • 签名验证:任何人都可以使用公钥验证签名的有效性
  • 兼容性:ED25519 是现代密码学标准,被广泛支持

导入相关模块:

go
import (
    "github.com/dromara/dongle"
    "github.com/dromara/dongle/crypto/keypair"
)

创建密钥对 ​

go
kp := keypair.NewEd25519KeyPair()

生成密钥对 ​

go
// 生成 ED25519 密钥对
err := kp.GenKeyPair()
if err != nil {
    panic(err)
}

// 获取 PEM 格式公钥
publicKey := kp.PublicKey  
// 获取 PEM 格式私钥
privateKey := kp.PrivateKey

从已有 PEM 格式密钥设置密钥对 ​

go
// 设置 PEM 格式公钥
kp.PublicKey = []byte(`-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEA4rUw82pvYFUDIWmnUKuHTnueHB3OzgAwR3ADXHQh/GQ=
-----END PUBLIC KEY-----`)

// 设置 PEM 格式私钥
kp.PrivateKey = []byte(`-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIHZ5DPAF8Gdrkwjp1pPd+aYY+9DqDpTVzHXIllrsdx4l
-----END PRIVATE KEY-----`)

从已有 DER 格式密钥设置密钥对 ​

除 base64 编码的 DER 外,SetPublicKey / SetPrivateKey 还接受 hex 编码的 DER、裸 DER、32 字节公钥、32 字节私钥种子与 64 字节私钥,并统一归一化为 PEM。

go
// 设置经过 base64 编码的 DER 格式公钥
kp.SetPublicKey([]byte("MCowBQYDK2VwAyEA4rUw82pvYFUDIWmnUKuHTnueHB3OzgAwR3ADXHQh/GQ="))
// 设置经过 base64 编码的 DER 格式私钥
kp.SetPrivateKey([]byte("MC4CAQAwBQYDK2VwBCIEIHZ5DPAF8Gdrkwjp1pPd+aYY+9DqDpTVzHXIllrsdx4l"))

将 DER 格式密钥格式化成 PEM 格式 ​

go
// 将 `base64` 编码的 `DER` 格式公钥格式化为 `PEM` 格式公钥
publicKey, err := kp.FormatPublicKey([]byte("MCowBQYDK2VwAyEA4rUw82pvYFUDIWmnUKuHTnueHB3OzgAwR3ADXHQh/GQ="))

// 将 `base64` 编码的 `DER` 格式私钥格式化为 `PEM` 格式私钥
privateKey, err := kp.FormatPrivateKey([]byte("MC4CAQAwBQYDK2VwBCIEIHZ5DPAF8Gdrkwjp1pPd+aYY+9DqDpTVzHXIllrsdx4l"))

将 PEM 格式密钥压缩成 DER 格式 ​

go
// 将 PEM 格式公钥压缩成经过 base64 编码的 DER 格式(提取 PEM 中的 base64 编码 DER)
publicKey := kp.CompressPublicKey([]byte(`-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEA4rUw82pvYFUDIWmnUKuHTnueHB3OzgAwR3ADXHQh/GQ=
-----END PUBLIC KEY-----`))

// 将 PEM 格式私钥压缩成经过 base64 编码的 DER 格式(提取 PEM 中的 base64 编码 DER)
privateKey := kp.CompressPrivateKey([]byte(`-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIHZ5DPAF8Gdrkwjp1pPd+aYY+9DqDpTVzHXIllrsdx4l
-----END PRIVATE KEY-----`))

私钥签名 ​

输入数据 ​

go
// 输入字符串
signer := dongle.Sign.FromString("hello world").ByEd25519(kp)
// 输入字节切片
signer := dongle.Sign.FromBytes([]byte("hello world")).ByEd25519(kp)
// 输入文件流
file, _ := os.Open("test.txt")
signer := dongle.Sign.FromFile(file).ByEd25519(kp)

// 检查签名错误
if signer.Error != nil {
	fmt.Printf("签名错误: %v\n", signer.Error)
	return
}

输出数据 ​

go
// 输出 Hex 编码签名字符串
hexString := signer.ToHexString() // a1b2c3d4e5f6...
// 输出 Hex 编码签名字节切片
hexBytes := signer.ToHexBytes()  // []byte("a1b2c3d4e5f6...")

// 输出 Base64 编码签名字符串
base64String := signer.ToBase64String() // obbD1OX2...
// 输出 Base64 编码签名字节切片
base64Bytes := signer.ToBase64Bytes()  // []byte("obbD1OX2...")

// 输出 原始 签名字符串
rawString := signer.ToRawString()
// 输出 原始 签名字节切片
rawBytes := signer.ToRawBytes()

公钥验证 ​

输入数据 ​

注意:WithXxxSign 方法必须在 ByEd25519 之前调用

go
// 输入字符串
verifier := dongle.Verify.FromString("hello world")
// 输入字节切片
verifier := dongle.Verify.FromBytes([]byte("hello world"))
// 输入文件流
file, _ := os.Open("test.txt")
verifier := dongle.Verify.FromFile(file)

// 设置 Hex 编码签名
verifier.WithHexSign(hexBytes).ByEd25519(kp)
// 设置 Base64 编码签名
verifier.WithBase64Sign(base64Bytes).ByEd25519(kp)
// 设置未编码原始签名
verifier.WithRawSign(rawBytes).ByEd25519(kp)

// 检查验证错误
if verifier.Error != nil {
    fmt.Printf("验证错误: %v\n", verifier.Error)
    return
}

输出数据 ​

go
// 输出验证结果
verifier.ToBool() // true 或 false

基于 MIT 许可发布,未经许可禁止任何形式的转载