ED25519
ED25519 是一种基于椭圆曲线的数字签名算法,使用 Curve25519
椭圆曲线和 Edwards
坐标系。dongle
支持标准和流式 ED25519
数字签名,提供快速、安全的签名和验证功能。
ED25519 算法特点:
- 高性能:签名和验证速度快,比传统
RSA
算法性能更优 - 安全性高:使用
256
位椭圆曲线,提供相当于3072
位 RSA 的安全强度 - 密钥短小:公钥和私钥长度仅
32
字节,签名长度64
字节 - 抗侧信道攻击:算法设计天然抵抗定时攻击等侧信道攻击
- 确定性签名:对相同数据的签名结果确定,便于测试和调试
注意事项:
- 密钥格式:ED25519 只支持
PKCS#8
格式密钥,不支持PKCS#1
格式 - 密钥长度:ED25519 使用固定长度的密钥,无需选择密钥长度
- 哈希算法:ED25519 内置使用
SHA-512
哈希,无需额外指定哈希算法 - 私钥安全:私钥必须妥善保管,不能泄露,只有私钥持有者才能生成有效签名
- 签名验证:任何人都可以使用公钥验证签名的有效性
- 兼容性:ED25519 是现代密码学标准,被广泛支持
导入相关模块:
go
import (
"github.com/dromara/dongle"
"github.com/dromara/dongle/crypto/keypair"
)
创建密钥对
go
kp := keypair.NewEd25519KeyPair()
生成密钥对
go
// 生成 ED25519 密钥对
kp.GenKeyPair()
// 获取 PEM 格式公钥
publicKey := kp.PublicKey
// 获取 PEM 格式私钥
privateKey := kp.PrivateKey
从已有 PEM 密钥设置密钥对
go
// 设置 PEM 格式公钥
kp.PublicKey = []byte(`-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAGb9ECWmEzf6FQbrBZ9w7lshQhqowtrbLDFw4rXAxZuE=
-----END PUBLIC KEY-----`)
// 设置 PEM 格式私钥
kp.PrivateKey = []byte(`-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEINTuctv5E1hK1bbY8fdp+K06/nwoy/HU++CXqI9EdVhC
-----END PRIVATE KEY-----`)
从已有 PEM 密钥文件加载密钥对
go
// 从 PEM 文件加载公钥
publicKeyFile, _ := os.Open("ed25519_public_key.pem")
kp.LoadPublicKey(publicKeyFile)
// 从 PEM 文件加载私钥
privateKeyFile, _ := os.Open("ed25519_private_key.pem")
kp.LoadPrivateKey(privateKeyFile)
从已有字符串密钥设置密钥对
go
// 设置字符串格式公钥,会自动转换成对应的 PEM 格式公钥
kp.SetPublicKey([]byte("Gb9ECWmEzf6FQbrBZ9w7lshQhqowtrbLDFw4rXAxZuE="))
// 设置字符串格式私钥,会自动转换成对应的 PEM 格式私钥
kp.SetPrivateKey([]byte("1O5y2/kTWErVttjx92n4rTr+fCjL8dT74Jeoj0R1WEI="))
私钥签名
输入数据
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(rawBytes).ByEd25519(kp)
// 设置 Base64 编码签名
verifier.WithBase64Sign(rawBytes).ByEd25519(kp)
// 设置未编码原始签名
verifier.WithRawSign(rawBytes).ByEd25519(kp)
// 检查验证错误
if verifier.Error != nil {
fmt.Printf("验证错误: %v\n", verifier.Error)
return
}
输出数据
go
// 输出验证结果
verifier.ToBool() // true 或 false