1

crypto:sign/4 を使用してメッセージに署名しようとしましたが、失敗しました。Erlang で ECDSA を使用してメッセージに署名する方法を誰か教えてくれませんか? ありがとう。(Erlang バージョン R16B01 を使用しています。)

モジュールコード:

-module(message).

-compile(export_all).

go() ->
    {_PubKey, PriKey} = crypto:generate_key(ecdh, secp256k1),
    SigBin = sign_message(PriKey, "Hello"),
    SigBin.

sign_message(PriKey, Msg) ->
    Algorithm = ecdsa,
    DigestType = sha256,
    MsgBin = list_to_binary(Msg),
    SigBin = crypto:sign(Algorithm, DigestType, MsgBin, PriKey),
    SigBin.

しかし、テスト実行で失敗しました:

1> message:go().
** exception error: no function clause matching crypto:sign(ecdsa,sha256,
                                                        {digest,

        <<24,95,141,179,34,113,254,37,245,97,166,252,147,
        139,46,38,67,6,236,48,78,218,81,128,...>>},
        <<189,38,200,204,95,248,54,69,42,65,216,165,242,228,100,
        54,158,5,61,174,58,198,191,161,9,...>>) (crypto.erl, line 462)

Paul のおかげで、このエラーは次の変更を行うことで修正できます。

変化する:

SigBin = crypto:sign(Algorithm, DigestType, MsgBin, PriKey),

に:

SigBin = crypto:sign(Algorithm, DigestType, MsgBin, [PriKey, secp256k1]),
4

1 に答える 1

7

サポートされている他の 2 つのアルゴリズムとは異なり、ECDSA はドメイン パラメータを必要とするため、関数crypto:sign/4crypto:generate_key/2関数はECDSA にとって非常に紛らわしいものです。

エラー メッセージは、渡したパラメーターが関数のどの句とも一致しないことを示しているだけですcrypto:sign/4。間違った型の引数を渡している可能性があります。

呼び出された関数のソース コードを調べて、パラメーターに一致する句がない理由を確認できます。これは通常、独自の関数に対して行うことです。しかし、ここにcrypto:sign/4は適切に文書化されたシステム機能があります。

ドキュメントには次のように書かれています。

sign(Algorithm, DigestType, Msg, Key) -> binary()

種類:

Algorithm = rsa | dss | ecdsa

Msg = binary() | {digest,binary()}

メッセージは、署名されるバイナリの「平文」データか、「平文」のハッシュ値、つまりダイジェスト (平文) のいずれかです。

DigestType = digest_type()

Key = rsa_private() | dss_private() | [ecdh_private(),ecdh_params()]

最初の 3 つの引数は明らかに問題ありません。問題は鍵にあります。実際、コードは次のようになります。

{_PubKey, PriKey} = crypto:generate_key(ecdh, secp256k1)

のドキュメントを見ると、 ECDH の場合、がタイプであり、期待どおりではないcrypto:generate_key/2ことがわかります。PrivKeyecdh_private()[ecdh_private(),ecdh_params()]crypto:sign/4

サイン関数は、サイン キー パラメーターを介して曲線ドメイン パラメーターの識別を必要とするため、関数[PrivKey, secp256k1]に渡すことで修正できます。sign_message

于 2013-08-06T12:23:43.607 に答える