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(hexString).ByEd25519(kp)
// Base64エンコード署名を設定
verifier.WithBase64Sign(base64String).ByEd25519(kp)
// エンコードなし生署名を設定
verifier.WithRawSign(rawBytes).ByEd25519(kp)
// 検証エラーをチェック
if verifier.Error != nil {
fmt.Printf("検証エラー: %v\n", verifier.Error)
return
}
出力データ
go
// 検証結果を出力
verifier.ToBool() // true または false