3

Wei Dai の Crypto++ を使用して、アプリケーションで ECDSA キーペア (secp128r1) を作成します。署名と検証は期待どおりに機能します。署名の長さ (正確に 32 バイト) を最小限に抑えるために、メッセージ自体を署名に追加しません。

ただし、openssl で署名を作成すると、次のようになります。

$ cat test.txt | openssl dgst -ecdsa-with-SHA1 -sign sample.key -keyform DER > act.bin

OpenSSL は明らかにメッセージ自体を署名に入れるため、署名が大きくなります (例: 39 バイト)。を設定すると、Crypto++ で署名を検証できますCryptoPP::SignatureVerificationFilter::PUT_MESSAGE

結果の署名が正確に 32 バイトになるように、メッセージを署名に入れずにメッセージに署名するように OpenSSL に指示できますか?

4

3 に答える 3

9

CodesInChaos は正しいです。署名の余分なバイトは、ASN.1 エンコーディングによるものであり、署名されている元のメッセージではありません。たとえば、曲線 secp128r1 の ECDSA キーで生成された 39 バイトの署名は次のとおりです。

30 25 02 10 4E 32 32 90 CA D9 BD D2 5F 8B BE 3B
F2 BF E9 7F 02 11 00 A7 83 A6 68 AD 74 7E 1A 0E
8F 73 BD DF 7A E8 B5

30 は、シーケンスが続くことを示します。25 は、シーケンスの長さが 0x25 バイトであることを示しています。02 は、シーケンスの最初の項目が整数であることを示します。10 は、最初の整数の長さが 0x10 バイトであることを示しています。次の 0x10 (16) バイトは、ECDSA 署名の「r」値です。最初の整数の後にバイト 02 が続きます。これは、シーケンスの 2 番目の整数が始まろうとしていることを示しています。11 は、次の 0x11 (17) バイトが ECDSA 署名の「s」値である 2 番目の整数を構成していることを示しています。整数の最初のバイトが 00 であるため、11 バイトです。整数の最初のバイトが >= 0x80 の場合は常に「00」が挿入されます。これは、負の整数を示す最上位ビットが 1 になるのを避けるためです。

結局のところ、実際の署名値は次のとおりです。

r: 4E 32 32 90 CA D9 BD D2 5F 8B BE 3B F2 BF E9 7F
s: A7 83 A6 68 AD 74 7E 1A 0E 8F 73 BD DF 7A E8 B5

「余分な」バイトは ASN.1 フォーマット用です。

于 2013-08-21T06:56:18.590 に答える
0

まず、128bit の EC は約 64bit のセキュリティを提供することに注意してください。次に、openssl が追加するメッセージではないと思います。5 バイトでは足りないからです。とにかく、ヘッドまたはテールを使用して余分なバイトを削除できます。

于 2013-06-26T13:17:21.030 に答える