1

ECDSAアルゴリズムでBCryptSignHashを使用して、Windowsでハッシュ値に署名しました。出力署名バッファの長さは 64 バイトです。また、ハッシュに署名したBCryptGenerateKeyPair関数 (BCRYPT_ECDSA_P256_ALGORITHM アルゴリズム) を使用して公開鍵と秘密鍵のブロブを生成しました。

Linux でこの鍵ペアを使用して、この署名を検証する必要があります。リンクを使用して、生成された公開鍵と秘密鍵のペアを解読できます "そして、Linux でも同じものを使用できます。

生成される 64 バイトの署名は、理想的には署名ペア (r,s) ( http://en.wikipedia.org/wiki/Elliptic_Curve_DSA ) である必要があります。

Linux で署名ブロブの内容を (r,s) ペアにマップして検証できるように、生成された 64 バイトの署名を理解する方法はありますか?

または、Linux で生成された署名を検証する簡単な方法はありますか?

ありがとう

4

1 に答える 1

2

Linux で署名ブロブの内容を (r,s) ペアにマップして検証できるように、生成された 64 バイトの署名を理解する方法はありますか?

randsは P1363 形式で、単にrandを 2の補数形式で連結sしたものです。つまり、署名は単純r || sです。

この形式を使用するには、ハッシュを知る必要があります。たとえば、SHA1 はr20 バイトの と 20 バイトのを作成しsます。rorが「短すぎる」場合sは、左側に 0 が埋め込まれます。

Java と OpenPGP は P1363 とは異なります。Java と OpenPGP は ASN.1 エンコーディングを使用します。

SEQUENCE ::= {
  r INTEGER,
  s INTEGER
}

Linux で使用するライブラリによっては、フォーマット間の変換が必要になる場合があります。Cryptographic Interoperability: Digital Signaturesは、いくつかの異なるライブラリを使用した署名と検証の例を示しています。


または、Linux で生成された署名を検証する簡単な方法はありますか?

Crypto++を試してください。Microsoft と Crypto++ は同じ署名形式を使用していると思いますので、変換する必要はありません。詳細については、楕円曲線デジタル署名アルゴリズムを参照してください。

于 2014-01-10T15:24:30.317 に答える