Ed25519 - 暗号化全般

暗号化全般 | IT用語集

Ed25519とは

Ed25519は、Daniel J. Bernstein、Niels Duif、Tanja Lange、Peter Schwabe、Bo-Yin Yangらが設計し2011年の論文で発表した、EdDSA(Edwards-curve Digital Signature Algorithm)方式のデジタル署名アルゴリズムです。IETFにより2017年にRFC 8032として標準化され、SSHでの利用はRFC 8709、鍵形式はRFC 8410でそれぞれ規定されています。

名前の「25519」は、演算に使う素数体の位数 p = 2^255 - 19 に由来します。この素数を法とする体上の「ツイスト・エドワーズ曲線(twisted Edwards curve)」上で演算を行うことで、約128ビット相当の安全性レベル(総当たりに必要な計算量がおおむね2^128程度)を、わずか256ビットの鍵長で実現しています。同等の安全性をRSAで得るにはおよそ3072ビットの鍵長が必要とされており、鍵サイズ・署名サイズ・演算コストのいずれの面でもEd25519が有利です。2026年時点でも、この曲線・アルゴリズムに対する実用的な解読手法は報告されていません。

Ed25519の特徴:

  • 短い鍵長:256ビット(RSA-3072と同等以上の安全性)
  • 高速:署名生成・検証が非常に速く、汎用CPUでも1コアで毎秒数万回規模の署名検証が可能とされる
  • 決定論的:同じ秘密鍵・同じメッセージからは常に同じ署名が生成される(ECDSAのような乱数生成器への依存がない)
  • 定数時間実装がしやすい:条件分岐やテーブル参照の少ない演算方式のため、タイミング攻撃対策を実装しやすい
  • 署名専用:Ed25519自体は鍵交換(暗号化)には使えず、鍵交換にはRFC 7748で規定される姉妹曲線X25519を使う

仕組み・詳細解説

数学的基盤:ツイスト・エドワーズ曲線

Ed25519が用いる曲線は、次のツイスト・エドワーズ方程式で定義されます。

-x^2 + y^2 = 1 + d・x^2・y^2  (mod p)
p = 2^255 - 19
d = -121665 / 121666  (mod p)

この曲線は、X25519が使うモンゴメリー曲線Curve25519と「双有理同値(birationally equivalent)」の関係にあり、同じ有限体・同じ位数の巡回群を共有しています。エドワーズ形式は加算公式に例外ケース(無限遠点を特別扱いする必要がないなど)がなく「完全加算則(complete addition law)」を持つため、実装時の条件分岐によるサイドチャネル漏洩のリスクを減らせる点が採用理由の一つになっています。

鍵生成の流れ

Ed25519の鍵ペアは、一般に以下の手順で生成されます。

  • 32バイトのランダムシード(秘密鍵の種)を生成する
  • このシードをSHA-512でハッシュし、64バイトの出力を得る
  • 出力の下位32バイトに「クランピング(clamping)」と呼ばれるビット操作(下位3ビットを0に、最上位ビットを0に、その一つ下のビットを1に固定)を施し、スカラー値sを得る
  • ベースポイントB(曲線上の生成元)に対しスカラー倍算 A = sB を行い、得られた点Aを公開鍵とする
  • ハッシュ出力の上位32バイトは、署名生成時に使う「プレフィックス」として保持しておく

クランピングは、Ed25519の曲線が持つ群構造(位数が8の倍数を含む「コファクター8」の構造であること)に起因する小群攻撃を防ぎ、スカラー値のビット長を一定に保って一部実装でのタイミング差を抑えるための処理です。

署名生成・検証の手順

署名生成はおおむね次の流れで行われます。

r = SHA-512(prefix || message)   // メッセージ依存の決定的な値
R = rB                            // Rは曲線上の点
k = SHA-512(R || A || message)    // チャレンジ値
S = (r + k・s) mod L               // Lはベースポイントの位数
署名 = R || S  (合計64バイト)

検証側は、受け取った署名(R, S)と公開鍵Aから 8・S・B = 8・R + 8・k・A が成立するかを確認します(両辺を8倍しているのはコファクターの影響を吸収するため)。この等式が成立すれば、対応する秘密鍵sを保持する者が同じメッセージに対して署名したものと判定できます。署名は常にR(32バイト)とS(32バイト)を連結した64バイト固定長になります。

決定的署名がもたらす安全性

ECDSAでは署名のたびに秘密の乱数(ノンスk)を新規に生成する必要があり、この乱数の質が低い場合や使い回された場合に秘密鍵そのものが復元されてしまう事故が実際に起きています。よく知られる事例として、2010年に報告されたSony PlayStation 3のコード署名鍵漏洩は、本来毎回変えるべきECDSA署名のノンスkを固定値にしていたことが原因でした。Ed25519はノンスをメッセージと秘密鍵からハッシュ関数で決定的に導出するため、乱数生成器(RNG)の品質不備に起因するこの種の鍵漏洩リスクを設計上排除している点が実務上の大きな利点です。

使用例

SSH設定での優先順位

OpenSSHでは、複数の鍵アルゴリズムを併用する場合に優先順位を指定できます。新規接続では可能な限りEd25519を優先し、対応していないレガシー機器向けにECDSA・RSAをフォールバックとして残すのが実務上の定石です。

# ~/.ssh/config
Host *
    IdentityFile ~/.ssh/id_ed25519
    HostKeyAlgorithms ssh-ed25519,ecdsa-sha2-nistp256,rsa-sha2-512
    PubkeyAcceptedAlgorithms ssh-ed25519,ecdsa-sha2-nistp256,rsa-sha2-512

Pythonでの署名・検証

from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
from cryptography.hazmat.primitives import serialization

# 鍵ペア生成
private_key = Ed25519PrivateKey.generate()
public_key = private_key.public_key()

# 署名
message = b"Hello, World!"
signature = private_key.sign(message)

# 検証(不正な場合は例外 InvalidSignature が送出される)
public_key.verify(signature, message)

OpenSSLコマンドラインでの鍵生成・署名

OpenSSL 1.1.1以降では、汎用の公開鍵APIを通じてEd25519の鍵生成・署名・検証がコマンドラインからも行えます。

# 秘密鍵の生成(PEM形式)
openssl genpkey -algorithm ed25519 -out ed25519_private.pem

# 公開鍵の取り出し
openssl pkey -in ed25519_private.pem -pubout -out ed25519_public.pem

# 署名の生成と検証
openssl pkeyutl -sign -inkey ed25519_private.pem -rawin -in message.txt -out sig.bin
openssl pkeyutl -verify -pubin -inkey ed25519_public.pem -rawin -in message.txt -sigfile sig.bin

Gitのコミット署名

Git 2.34以降はSSH鍵によるコミット署名(gpg.format = ssh)に対応しており、既存のEd25519 SSH鍵をそのままコミット署名に流用できます。GitHubもEd25519形式のSSH署名キーを「Verified」コミットの検証鍵として登録可能です。

git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true

メリット・デメリット

メリット

  • 鍵・署名サイズが小さい:公開鍵32バイト、署名64バイトと非常にコンパクトで、証明書チェーンやトークンのサイズ削減に寄与する
  • 高速な署名生成・検証:RSAはもちろん、同じビット強度のECDSA P-256と比べても実装上の最適化余地が大きい
  • ノンス漏洩の心配がない:署名が決定的であるため、乱数生成器の欠陥に起因する秘密鍵漏洩(ECDSAで実際に起きた事故)が構造的に発生しない
  • 定数時間実装がしやすい:完全加算則を持つツイスト・エドワーズ曲線を採用しているため、条件分岐に起因するタイミング攻撃・キャッシュ攻撃への耐性を確保しやすい
  • パラメータ選択の余地がない=誤設定のリスクが低い:RSAの鍵長選択やECDSAの曲線選択のような設定ミスが原理的に起こりにくい

デメリット・注意点

  • 古い環境での対応状況:OpenSSH 6.5(2014年)より前、Java 15より前の標準ライブラリ、一部の古いHSM・スマートカードでは未対応の場合がある
  • FIPS環境での取り扱い:長らくFIPS 186-4の承認アルゴリズムに含まれていなかった経緯があり、FIPS準拠が必須の環境(官公庁システムなど)では利用可否を個別に確認する必要がある(後述)
  • 鍵交換には使えない:Ed25519は署名専用であり、鍵交換(ECDH)を行うには別途X25519を使う必要がある。両者は数学的に近い関係にあるが鍵は流用できない
  • 曲線が固定:柔軟なパラメータ選択ができない反面、独自のセキュリティ要件(特殊な曲線が必要な場合など)には対応できない
  • 量子コンピュータへの耐性なし:楕円曲線離散対数問題に基づくため、大規模な量子コンピュータが実用化されればShorのアルゴリズムで解読され得る(詳細は後述)

Ed25519 vs RSA vs ECDSA、混同されやすい用語との違い

アルゴリズム鍵長速度推奨度
Ed25519256ビット最速最推奨
ECDSA P-256256ビット速い良い(FIPS必須環境の定番)
RSA 30723072ビット遅い互換性維持用

Ed25519 と Curve25519 / X25519

「Curve25519」はモンゴメリー形式の曲線そのものを指す名称で、RFC 7748で規定される鍵交換アルゴリズム「X25519」の土台になっています。一方「Ed25519」は、同じ有限体上に定義された双有理同値のツイスト・エドワーズ形式の曲線を使う署名アルゴリズムです。数学的には近い関係にありますが、Curve25519(X25519)は鍵交換(暗号化通信の共通鍵合意)専用、Ed25519は署名専用という役割分担になっており、鍵をそのまま流用することはできません。ドキュメントによっては両者をまとめて「Curve25519ファミリー」と表現することもあり、そこが混同の原因になりやすい点です。

EdDSA と ECDSA

どちらも楕円曲線上の離散対数問題の困難性を安全性の根拠にしていますが、署名時に必要な乱数(ノンス)の扱いが決定的に異なります。ECDSAは署名のたびに安全な乱数kを新規生成する必要があり、その生成が不十分だと秘密鍵が漏洩します。EdDSA(Ed25519)はノンスをハッシュ関数で決定的に導出するため、この種の実装ミスに起因する脆弱性が構造的に起きません。

Ed25519 と Ed448

Ed448はRFC 8032でEd25519と同時に規定された、より大きな448ビットの曲線(通称Goldilocksカーブ)を使う署名方式です。安全性レベルはおよそ224ビット相当とされ、Ed25519(約128ビット相当)より高いセキュリティマージンを持ちますが、その分演算コストは大きくなります。長期保存が必要な署名や、より高い安全マージンが求められる用途を除けば、一般にはEd25519で十分とされています。

Ed25519ph / Ed25519ctx バリアント

RFC 8032では、通常のEd25519(PureEdDSA)に加え、あらかじめメッセージをハッシュしてから署名する「Ed25519ph」(大きなメッセージのストリーミング署名向け)、コンテキスト文字列を付加できる「Ed25519ctx」も定義されています。実務で単に「Ed25519」と言う場合はPureEdDSAを指すことがほとんどですが、ライブラリによって対応バリアントが異なるため、相互運用時は仕様を確認する必要があります。

実務ポイントとトラブル事例

実務では、SSH鍵の新規発行時にEd25519を第一選択とし、鍵生成の速さとファイルサイズの小ささを活かすのが定石です。RSA鍵と比較すると、鍵ファイルは大幅に小さくなります。

# Ed25519 SSH鍵の生成
ssh-keygen -t ed25519 -C "your_email@example.com"
# 公開鍵: 68バイト程度(Base64エンコード後)
# 秘密鍵: 399バイト程度

# RSA 4096との比較
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 公開鍵: 725バイト程度
# 秘密鍵: 3,243バイト程度

古いシステムとの互換性

症状:レガシーなSSHクライアント・サーバーやCI/CDのエージェント、一部の古いネットワーク機器がEd25519をサポートせず、鍵交換や認証に失敗する。

対策:RSA鍵を併用し、ssh-configのHostKeyAlgorithms・PubkeyAcceptedAlgorithmsで優先順位付けとフォールバックを設定する。移行期は両方の公開鍵をauthorized_keysに登録しておく。

FIPSモード・規制環境での利用制限

症状:政府機関や金融機関などFIPS 140検証済みモジュールの使用が義務付けられた環境で、Ed25519を使った署名がポリシー違反や動作エラーになる。

対策:使用するOpenSSL・HSM・クラウドKMSがFIPSモードでEdDSAをサポートしているか事前に確認する。対応していない場合は、同等の安全性を持つECDSA P-256/P-384を代替として検討する。

鍵形式・変換時のミス

症状:OpenSSH形式の秘密鍵とPKCS#8/PEM形式の相互変換時に、ツールによって対応状況が異なり読み込みエラーになる。

対策:ssh-keygen -p -m PEMやopensslコマンドで形式変換し、変換後は必ずopenssl pkey -textやssh-keygen -lfで鍵の内容・フィンガープリントを検証してから本番に投入する。

最新動向(2026年)

標準化・普及状況

OpenSSH 8.0以降はEd25519をデフォルトの推奨鍵形式として案内しており、GitHub・GitLabなどのコード管理サービスもEd25519 SSH鍵とSSH形式のコミット署名をサポートしています。NIST(米国国立標準技術研究所)も2023年公開のFIPS 186-5でEdDSA(Ed25519・Ed448)を正式な承認署名アルゴリズムとして追加しており、これによって政府機関・規制業界でもEd25519を採用しやすい環境が整いつつあります。

耐量子暗号への移行との関係

Ed25519は楕円曲線離散対数問題の困難性に依拠しているため、大規模な誤り訂正機能付き量子コンピュータが実用化されればShorのアルゴリズムにより解読され得ると考えられています。この移行に備え、TLSの鍵交換では既にX25519とNIST標準の格子暗号ML-KEM(旧CRYSTALS-Kyber)を組み合わせた「ハイブリッド鍵交換」がChromeやCloudflareなど主要ブラウザ・CDNで実運用されています。署名についても、Ed25519とNIST標準のML-DSA(旧CRYSTALS-Dilithium)を併用するハイブリッド署名の検討がIETFやOpenSSHコミュニティで進められており、当面はEd25519を使い続けつつ、将来の移行に備えて暗号アジリティ(アルゴリズムを容易に差し替えられる設計)を確保しておくことが実務上のポイントです。

パスキー・FIDO2周辺での位置づけ

WebAuthn/FIDO2のパスキー認証では、多くの実装がECDSA(ES256)を既定アルゴリズムとして使う一方、仕様上はEdDSA(EdDSA/Ed25519、COSE識別子-8)もサポート対象に含まれており、対応する認証器やライブラリでは選択可能になっています。

📝 関連ブログ記事

【2026年最新】OpenSSLの深刻な問題とは?

よくある質問(FAQ)

Q. Ed25519とは何ですか?

Ed25519はEdDSA(Edwards-curve Digital Signature Algorithm)に基づく楕円曲線デジタル署名アルゴリズムです。RSA-2048より短い256ビットの鍵で高いセキュリティを提供し、SSH鍵・TLS証明書・GitHubのコミット署名などで広く採用されています。

Q. Ed25519とRSAはどちらが安全ですか?

Ed25519はRSA-2048より短い鍵(256ビット)で同等以上のセキュリティを提供し、署名の生成・検証が高速です。また実装がよりシンプルで、タイミング攻撃に対して定常時間で動作します。新規のSSH鍵生成にはRSAよりEd25519を推奨します。

Q. ssh-keygenでEd25519鍵を生成するには?

ssh-keygen -t ed25519 -C 'your_email@example.com' コマンドで生成できます。従来のssh-keygen -t rsaよりもセキュアで生成が高速です。GitHubもEd25519をサポートしており、2021年以降はRSA-1024鍵を拒否するようになっています。

Q. Ed25519は量子コンピュータに対して安全ですか?

いいえ。Ed25519は楕円曲線離散対数問題に基づいており、理論上は十分に大きな量子コンピュータ(Shorのアルゴリズム)で解読される可能性があります。長期的には耐量子暗号(NIST標準のML-KEM・ML-DSA等)への移行、あるいはハイブリッド方式の採用が必要になると考えられています。

Q. Ed25519とCurve25519・X25519はどう違いますか?

Curve25519はモンゴメリー形式の曲線そのもので、鍵交換アルゴリズムX25519(RFC 7748)の土台です。Ed25519は同じ有限体上に定義された双有理同値のツイスト・エドワーズ曲線を使う署名アルゴリズムで、役割はCurve25519(X25519)が鍵交換専用、Ed25519が署名専用と分かれています。数学的に近い関係にありますが、鍵をそのまま流用することはできません。

Q. Ed25519はFIPS認証が必要な環境でも使えますか?

2023年公開のNIST FIPS 186-5でEdDSA(Ed25519・Ed448)が正式な承認アルゴリズムに追加されたため、対応済みのFIPSモジュールであれば利用できます。ただし利用中のOpenSSL・HSM・クラウドKMSが実際にFIPSモードでEdDSAをサポートしているかは製品ごとに異なるため、導入前に対応バージョンを確認する必要があります。未対応の場合はECDSA P-256などが代替候補になります。

SSH鍵管理のご相談