いくつかの値を含むメッセージの署名を確認する必要があります。私が持っている唯一のパラメータは、署名、公開鍵、および値自体です。署名の作成に使用されるアルゴリズムは、192ビットの楕円曲線暗号です。私はすでにネット上でコード例を見つけようとしましたが、この場合は何も見つかりませんでした。
検証にJavaを使用したこのアルゴリズムの経験はありますか?コードまたは例へのリンクを提供していただけますか?
ご協力ありがとうございました!
いくつかの値を含むメッセージの署名を確認する必要があります。私が持っている唯一のパラメータは、署名、公開鍵、および値自体です。署名の作成に使用されるアルゴリズムは、192ビットの楕円曲線暗号です。私はすでにネット上でコード例を見つけようとしましたが、この場合は何も見つかりませんでした。
検証にJavaを使用したこのアルゴリズムの経験はありますか?コードまたは例へのリンクを提供していただけますか?
ご協力ありがとうございました!
あなたはそこの情報が少し不足しています...
楕円曲線を使用するいくつかの署名スキームがありますが、最も普及している(はるかに)ECDSAです。次に、次の点について心配する必要があります。
署名は一連のビットで動作します。すべてのデータビットが正しくなければなりません。ここでは「値」があるため、これらの値をビット(またはバイト)のシーケンスにエンコードする必要があります。署名を検証するには、署名の生成に使用したものと同じエンコーディングを使用する必要があります。
ECDSAは、暗号化ハッシュ関数を使用して入力データをハッシュすることから始めます。ここでも、署名の生成に使用されたものと同じものを使用する必要があります。野蛮な推測として、ハッシュ関数はおそらくSHA-1だと思います。
ECDSAは楕円曲線で動作します。曲線のサイズは曲線を定義するのに十分ではありません。192ビットの曲線がたくさんあります。ただし、独自の曲線を定義するのは難しいため、ほとんどの人はFIPS186-3で定義されている15の曲線のうちの1つの曲線を使用します。これらの15個の曲線の1つは「192ビットサイズ」(「P-192」と呼ばれます)であるため、署名がその曲線を使用している可能性があります。
ECDSA公開鍵は、曲線点のエンコードです。曲線ポイントは、名目上、整数のペア(X、Y)です(これらはポイントの「座標」です)。これらの整数は、曲線が存在するベースフィールドからのものです。P-192曲線の場合、座標は192ビット整数です。このような公開キーの「通常の」エンコーディングは49バイトの文字列です。最初のバイトは0x02で、その後にXのビッグエンディアンの符号なしエンコーディング(24バイト)、Yの符号なしエンコーディング( 24バイト)が続きます。 。他のエンコーディングも可能です。
ECDSA署名は、正式には2つの整数値で構成されます。通常はrとs(192ビット整数も)と呼ばれます。ここでも、あなたが持っている署名はおそらく2つの整数のエンコーディングであるバイトのシーケンスです。2つの一般的なエンコーディングがあります。1つは両方の値の生のビッグエンディアン署名なしエンコーディング(したがって48バイトの署名)であり、もう1つはASN.1を使用します(長さ53または54バイト程度の署名用)。
@Ashkanが示唆しているように、弾力がある城を使用することは良い考えです。しかし、ご覧のとおり、状況についてはかなり多くの仮定があります。何が起こっているのかを完全に理解したい場合は、ANSI X9.62:2005(ECDSA規格)のコピーを購入してください。数学的な内容はかなり重いことに注意してください。
おそらくBouncy Castleライブラリを使用できます。
http://www.bouncycastle.org/wiki/display/JA1/Using+Elliptic+Curveを参照してください。