web-dev-qa-db-ja.com

Ed25519のどのような実装が存在しますか?

新しいSQRL認証 スキームはCurveに依存しています Ed25519 DanielBernsteinによって開発された暗号化。ただし、このスキームの実装を開始するには、最初にCurveEd25519の成熟した実装が必要です。

成熟した実装を知っている人はいますか? Java、.NET、またはその他の一般的なプラットフォームの場合は?

23

Curve25519対Ed25519

まず第一に、Curve25519とEd25519はまったく同じものではありません。それらは同じ基礎となる曲線に基づいていますが、異なる表現を使用しています。ほとんどの実装はCurve25519またはEd25519のいずれかですが、それらの間で一部のコードを再利用することは可能です。

Ed25519公開鍵をCurve25519に変換することは可能ですが、その逆の場合、符号ビットが失われます。つまり、2つのEd25519公開鍵は、1つのCurve25519公開鍵に対応します。秘密鍵も非常に似ています。


実装に関しては、実際の実装と、それらを使用可能な形式でパッケージ化するライブラリを区別することが重要です。

実際の実装

djbの実装 [〜#〜] supercop [〜#〜]

  • Ref cで記述、非常に遅い
  • djbのRef10はcで書かれており、まともなパフォーマンス
  • djbのAMD64-64-24kAMD64-51-30kは、アセンブリで記述されており、Ref10の約2倍の速度です。

彼はまた、NaClで以前の互換性のないプロトタイプを作成しました。それを使用しないでください

Floodyberryのドンナ 実装

アセンブリとcの両方のいくつかのバリアントが含まれています。 64ビット用に最適化されたものもあれば、32ビット用に最適化されたものもあります。

ライブラリ

  • LibSodium

    Cライブラリ、現在Ref10実装を使用

    多くのプログラミング言語のバインディング 。これはおそらく最も人気のあるバージョンであり、私がほとんどの人に推奨するものです。

    認証付き暗号化(XSalsa20Poly1305)、ハッシュ、Curve25519鍵交換など、NaClの他の暗号化機能が多数含まれています。

  • ナイトクラッカーのEd25519

    Cライブラリ、Ref10実装を使用します。

    このライブラリの最も興味深い機能は、Ed25519公開鍵を使用した鍵交換をサポートしていることです。ただし、共有キーはハッシュされないため、Curve25519と同じ共有シークレットは生成されません。

    Win32およびWin64用のビルド済みバイナリが含まれています。

  • 私の C#ポート

    純粋なマネージコードであり、32ビットおよび64ビットプラットフォームで変更なく機能します。 Ref10に基づく。 cの実装よりも少し遅いですが、違いは驚くほど小さいです。

    Curve25519キーとEd25519キーの両方を使用したNaClと互換性のあるキー交換をサポートし、NaClの他の暗号機能を多数含んでいます。 LibSodiumと同様の機能セットを目指しています。

    Ed25519署名関数は機能し、妥当な量のテストを確認しましたが、ライブラリの他の部分は少し荒いです。

  • SUPERCOPまたはFloodyberryのコードからの実装を直接使用します。

    おそらくビルドにはもう少し作業が必要ですが、パフォーマンスが向上し(〜2x)、不要なコードを持ち歩く必要がなくなります。


今のところLibSodiumを使用することをお勧めします。比較的人気があり、手入れが行き届いています。パフォーマンスはまともであり、本当に署名の多いアプリケーションでのみパフォーマンスの問題を引き起こすはずです。

34
CodesInChaos

CodesInChaosの答えに追加する:

ライブラリ

  • 私の Javaポート

    参照10に基づいており、暗号化プロバイダーに追加できるように標準のJCAAPIを提供します。

6
str4d

群を抜いて最も成熟したパフォーマンスの高いものは、ダニエル・バーンスタイン自身が書いたものです。 [〜#〜] supercop [〜#〜] 内にあります。

ただし、そのAPIは非常に扱いにくく、必要なものを取得するにはかなりの掘り下げ/抽出が必要です。他の人の作業を節約するために、私はこれを自分で行い、コードを Github に配置しました。

ただし、正確な用語に注意してください。Ed25519とCurve25519は関連していますが、異なるものです。知っておくべきことは、Ed25519は公開/秘密鍵署名システムであり、Curve25519は鍵交換であるということです。 Ed25519キーペアはCurve25519キーペアに変換できますが、その逆についてはよくわかりません。 Githubの私のライブラリは、すべてをEd25519キーペアに保持し、キー交換のためにCurve25519に変換します。

2
orlp

組み込み実装

0
puetzk