Skip to content

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 鍵ペアを生成
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-----
MCowBQYDK2VwAyEAGb9ECWmEzf6FQbrBZ9w7lshQhqowtrbLDFw4rXAxZuE=
-----END PUBLIC KEY-----`)

// PEM フォーマット秘密鍵を設定
kp.PrivateKey = []byte(`-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEINTuctv5E1hK1bbY8fdp+K06/nwoy/HU++CXqI9EdVhC
-----END PRIVATE KEY-----`)

既存 DER 形式鍵から鍵ペアを設定

go
// base64 エンコードされた DER 形式公開鍵を設定
kp.SetPublicKey([]byte("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqzZNa9VrcewyU6wDoV7Y9kAHqX1VK0B3Rb6GNmQe4zLEfce7cVTaLrc4VGTKl35tADG1cRHqtaG4S/WttpiGZBhxJy4MpOXb6eIPiVLsn2lL+rJo5XdbSr3gyjxEOQQ97ihtw4lDd5wMo4bIOuw1LtMezHC1outlM6x+/BB0BSQIDAQAB"))
// base64 エンコードされた DER 形式秘密鍵を設定
kp.SetPrivateKey([]byte("MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKrNk1r1Wtx7DJTrAOhXtj2QAepfVUrQHdFvoY2ZB7jMsR9x7txVNoutzhUZMqXfm0AMbVxEeq1obhL9a22mIZkGHEnLgyk5dvp4g+JUuyfaUv6smjld1tKveDKPEQ5BD3uKG3DiUN3nAyjhsg67DUu0x7McLWi62UzrH78EHQFJAgMBAAECgYAeo3nHWzPNURVUsUMcan96U5bEYA2AugxfQVMNf2HvOGidZ2adh3udWrQY/MglERNcTd5gKriG2rDEH0liBecIrNKsBL4lV+qHEGRUcnDDdtUBdGInEU8lve5keDgmX+/huXSRJ+3tYA5u9j+32RquVczvIdtb5XnBLUl61k0osQJBAON5+eJjtw6xpn+pveU92BSHvaJYVyrLHwUjR07aNKb7GlGVM3MGf1FCa8WQUo9uUzYxGLtg5Qf3sqwOrwPd5UsCQQDAOF/zWqGuY3HfV/1wgiXiWp8rc+S8tanMj5M37QQbYW5YLjUmJImoklVahv3qlgLZdEN5ZSueM5jfoSFtNts7AkBKoRDvSiGbi4MBbTHkzLZgfewkH/FxE7S4nctePk553fXTgCyh9ya8BRuQdHnxnpNkOxVPHEnnpEcVFbgrf5gjAkB7KmRI4VTiEfRgINhTJAG0VU7SH/N7+4cufPzfA+7ywG5c8Fa79wOB0SoB1KeUjcSLo5Ssj2fwea1F9dAeU90LAkBJQFofveaDa3YlN4EQZOcCvJKmg7xwWuGxFVTZDVVEws7UCQbEOEEXZrNd9x0IF5kpPLR+rxuaRPgUNaDGIh5o"))

DER 形式鍵を PEM 形式にフォーマット

go
// `base64` エンコードされた `DER` 形式公開鍵を `PEM` 形式公開鍵にフォーマット
publicKey, err := kp.FormatPublicKey([]byte("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqzZNa9VrcewyU6wDoV7Y9kAHqX1VK0B3Rb6GNmQe4zLEfce7cVTaLrc4VGTKl35tADG1cRHqtaG4S/WttpiGZBhxJy4MpOXb6eIPiVLsn2lL+rJo5XdbSr3gyjxEOQQ97ihtw4lDd5wMo4bIOuw1LtMezHC1outlM6x+/BB0BSQIDAQAB"))

// `base64` エンコードされた `DER` 形式秘密鍵を `PEM` 形式公開鍵にフォーマット
privateKey, err := kp.FormatPrivateKey([]byte("MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKrNk1r1Wtx7DJTrAOhXtj2QAepfVUrQHdFvoY2ZB7jMsR9x7txVNoutzhUZMqXfm0AMbVxEeq1obhL9a22mIZkGHEnLgyk5dvp4g+JUuyfaUv6smjld1tKveDKPEQ5BD3uKG3DiUN3nAyjhsg67DUu0x7McLWi62UzrH78EHQFJAgMBAAECgYAeo3nHWzPNURVUsUMcan96U5bEYA2AugxfQVMNf2HvOGidZ2adh3udWrQY/MglERNcTd5gKriG2rDEH0liBecIrNKsBL4lV+qHEGRUcnDDdtUBdGInEU8lve5keDgmX+/huXSRJ+3tYA5u9j+32RquVczvIdtb5XnBLUl61k0osQJBAON5+eJjtw6xpn+pveU92BSHvaJYVyrLHwUjR07aNKb7GlGVM3MGf1FCa8WQUo9uUzYxGLtg5Qf3sqwOrwPd5UsCQQDAOF/zWqGuY3HfV/1wgiXiWp8rc+S8tanMj5M37QQbYW5YLjUmJImoklVahv3qlgLZdEN5ZSueM5jfoSFtNts7AkBKoRDvSiGbi4MBbTHkzLZgfewkH/FxE7S4nctePk553fXTgCyh9ya8BRuQdHnxnpNkOxVPHEnnpEcVFbgrf5gjAkB7KmRI4VTiEfRgINhTJAG0VU7SH/N7+4cufPzfA+7ywG5c8Fa79wOB0SoB1KeUjcSLo5Ssj2fwea1F9dAeU90LAkBJQFofveaDa3YlN4EQZOcCvJKmg7xwWuGxFVTZDVVEws7UCQbEOEEXZrNd9x0IF5kpPLR+rxuaRPgUNaDGIh5o"))

PEM 形式鍵を DER 形式に圧縮

go
// PEM 形式公開鍵を base64 エンコードされた DER 形式に圧縮(PEM 形式のヘッダー/フッターと改行を削除)
publicKey, err := kp.CompressPublicKey([]byte(`-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqzZNa9VrcewyU6wDoV7Y9kAHq
X1VK0B3Rb6GNmQe4zLEfce7cVTaLrc4VGTKl35tADG1cRHqtaG4S/WttpiGZBhxJ
y4MpOXb6eIPiVLsn2lL+rJo5XdbSr3gyjxEOQQ97ihtw4lDd5wMo4bIOuw1LtMez
HC1outlM6x+/BB0BSQIDAQAB
-----END PUBLIC KEY-----`))

// PEM 形式秘密鍵を base64 エンコードされた DER 形式に圧縮(PEM 形式のヘッダー/フッターと改行を削除)
privateKey, err := kp.CompressPrivateKey([]byte(`-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKrNk1r1Wtx7DJTr
AOhXtj2QAepfVUrQHdFvoY2ZB7jMsR9x7txVNoutzhUZMqXfm0AMbVxEeq1obhL9
a22mIZkGHEnLgyk5dvp4g+JUuyfaUv6smjld1tKveDKPEQ5BD3uKG3DiUN3nAyjh
sg67DUu0x7McLWi62UzrH78EHQFJAgMBAAECgYAeo3nHWzPNURVUsUMcan96U5bE
YA2AugxfQVMNf2HvOGidZ2adh3udWrQY/MglERNcTd5gKriG2rDEH0liBecIrNKs
BL4lV+qHEGRUcnDDdtUBdGInEU8lve5keDgmX+/huXSRJ+3tYA5u9j+32RquVczv
Idtb5XnBLUl61k0osQJBAON5+eJjtw6xpn+pveU92BSHvaJYVyrLHwUjR07aNKb7
GlGVM3MGf1FCa8WQUo9uUzYxGLtg5Qf3sqwOrwPd5UsCQQDAOF/zWqGuY3HfV/1w
giXiWp8rc+S8tanMj5M37QQbYW5YLjUmJImoklVahv3qlgLZdEN5ZSueM5jfoSFt
Nts7AkBKoRDvSiGbi4MBbTHkzLZgfewkH/FxE7S4nctePk553fXTgCyh9ya8BRuQ
dHnxnpNkOxVPHEnnpEcVFbgrf5gjAkB7KmRI4VTiEfRgINhTJAG0VU7SH/N7+4cuf
PzfA+7ywG5c8Fa79wOB0SoB1KeUjcSLo5Ssj2fwea1F9dAeU90LAkBJQFofveaD
a3YlN4EQZOcCvJKmg7xwWuGxFVTZDVVEws7UCQbEOEEXZrNd9x0IF5kpPLR+rxua
RPgUNaDGIh5o
-----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(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

MITライセンスに基づいて公開されており、許可なく複製することは禁止されています