実験的なDilithiumのJava実装、JCEプロバイダを含む
Dilithiumは、Cの参照実装とドキュメントに基づいたJavaの実装です。さらに、JCEプロバイダにラップしており、標準化されたインターフェースを介して簡単に使用することができます。
Dilithiumとは何でしょうか?RSAとECCという暗号アルゴリズムは、Shorのアルゴリズムを使用した量子コンピュータによる攻撃に対して脆弱性があることが長い間知られてきました。実際のところ、現実に存在する必要なサイズの量子コンピュータはまだ存在していませんが、この脆弱性を持たないアルゴリズムの検索が進行中です。実際に、NISTは6年以上にわたって量子安全な代替手法を特定するための競争を実施しています。7月5日、NISTはポスト量子デジタル署名スキームの3つの選択肢を発表しました。Dilithiumはその3つの中にあり、実際には主要なアルゴリズムとして推奨されています。著者におめでとうございます!私はこの新しいアルゴリズムを研究したかったので、実装してみることにしました。それがあなたが見ているものです 🙂
Dilithiumは、線形代数を考えるが、行列/ベクトルのエントリーが$R_q = \mathbb{Z}_q[X]/(X^n+1)$のリング内の多項式であるという、CRYSTALSスイートのアルゴリズムの一部です。詳細な情報(仕様や使用したCの参照実装など)については、彼らのページを参照してください。
参考実装と同様に、この実装はすべての3つの文書化されたセキュリティレベル(レベル2、3、5)をサポートしています。すべてのKATテストをパッケージからパスします。ドキュメントされた形式を使用しての直列化と逆直列化をサポートしています。
私は内部でDilithiumに使用されるSHAKE128/256アルゴリズムを提供するBouncy castleに依存しています。
重要!これは数日で書かれた「楽しい」実装です。本格的なコードを提供することを意図していません。いかなる種類の保証やサポートも提供されません。ただし、ポスト量子アルゴリズムに潜り込んで実験するために役立つことがあります。自己責任で使用してください。これらの条件が気に入らない場合は、このソフトウェアの使用を控える必要があります。
addProvider()を使用してプロバイダを追加する代わりに、.getInstance()メソッドを呼び出す際にプロバイダオブジェクトを明示的に指定することもできます(以下を参照)。
キーペアを生成するには、次のようにします:
上記の例ではセキュリティレベルを表すアルゴリズムパラメータ仕様を指定する必要があります。上記の例ではレベル2を使用していますが、3と5を選択することもできます。3つのパラメータ仕様オブジェクトは、DilithiumParameterSpecクラスの静的フィールドとして宣言されています。また、DilithiumParameterSpecにはgetSpecForSecurityLevel()という静的メソッドも提供されており、実行時に指定されたレベルの仕様を簡単に取得することができます。
キーペアを生成した後、署名は他のJCEプロバイダと同様に動作します。以下の例では、「Joy!」のバイト表現に署名しています。
署名と同様に、検証も他のJCEプロバイダと同様に動作します。
変数bには検証の結果が含まれます。ただし、不正な署名ではなく形式が正しくない場合には例外がスローされることに注意してください。
公開鍵と秘密鍵のオブジェクトに対して.getEncoded()メソッドを使用して、キーのバイト表現を取得することができます。フォーマットは参照実装と互換性があります。
バイト表現からキーをインスタンス化するために、キーファクトリが提供されています。これは、提供されたDilithiumPublicKeySpecおよびDilithiumPrivateKeySpecクラスとともに使用できます。
これらは2つのパラメータ、つまりパラメータ仕様(生成に使用されるものと同じ)とバイト表現を使用して構築されます。パラメータ仕様はバイト表現にエンコードされていないことに注意してください。パラメータの選択を推測する代わりに、明示的にパラメータを選択することにしました。将来的には、OIDなどを使用したASN.1ベースの形式が標準化され、それらはパラメータを明示的にエンコードするでしょう。もちろん、標準化プロセスが進むにつれて、シリアル化形式が変更される可能性もあります。
同様に、低レベルのインターフェースの代わりに、Dilithiumクラスの静的メソッドを直接使用して生成、署名、および検証することもできます。JCEクラスがそれをどのように行っているかを参照してください。
公式のDilithiumパッケージには、リクエストとレスポンスファイルを生成する既知の応答テストジェネレータが含まれています。私は、参照実装によって生成されたリクエストファイルを読み込み、テストを実行し、対応する応答ファイルを生成するためのJavaユーティリティであるKAT.javaを提供しています。次に、この応答ファイルを公式の既知の応答テストジェネレータによって生成されたものと比較し、バイトが同一であることを検証できます。KAT.javaプログラムは次のパラメータで実行されます:
必要なセキュリティレベル(2、3、または5)を第3引数として指定する必要があります。これは、Cの実装のconfig.hファイルで構成されているものと一致する必要があります。
このライブラリはApache 2.0ライセンスの下で利用可能です(LICENSEを参照)。コードは第三者によって潜在的な脆弱性のために調査されていないことに注意してください。また、製品用途に使用することは意図されていません。いかなる種類の保証も提供されません。これらの条件が気に入らない場合は、このソフトウェアの使用を控える必要があります。
CRYSTALSプロジェクトの詳細については、彼らのウェブサイトを参照してください。
メール:martin@thiim.net
注意
- この記事はAI(gpt-3.5-turbo)によって自動生成されたものです。
- この記事はHackerNewsに掲載された下記の記事を元に作成されています。
Java implementation of a quantum computing resistant cryptographic algorithm - 自動生成された記事の内容に問題があると思われる場合にはコメント欄にてご連絡ください。