2013-08-06 50 views
1

我試圖使用crypto:sign/4來簽署消息但失敗。任何人都可以告訴我如何在Erlang中使用ECDSA簽署消息?謝謝。 (我使用Erlang的版本R16B01。)我應該如何使用crypto:sign/4?

模塊代碼:

-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) 

感謝保羅,這個錯誤通過進行以下更改來修復。

變化:

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

到:

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

回答

6

crypto:sign/4crypto:generate_key/2功能相當混亂爲ECDSA作爲ECDSA需要域參數,不同於其他兩個支持的算法。

錯誤消息只是告訴您傳遞的參數不匹配crypto:sign/4函數的任何子句。您可能傳遞了錯誤類型的論點。

你可以看看被調用函數的源代碼,找出爲什麼沒有子句匹配你的參數。這通常是你爲自己的功能所做的。然而,在這裏,crypto:sign/4是一個系統功能,它被正確記錄。

的文檔的內容如下:

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

類型:

Algorithm = rsa | dss | ecdsa

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

msg是要簽名的二進制「明文」數據,或者是「cleartext」(即摘要(明文))的散列值。

DigestType = digest_type()

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

你的前三個參數明顯確定。問題在於關鍵。事實上,你的代碼是這樣的:

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

crypto:generate_key/2的文件看,你會發現,在ECDH的情況下,PrivKeyecdh_private()型的,而不是作爲[ecdh_private(),ecdh_params()]預計crypto:sign/4

修復方法是將[PrivKey, secp256k1]傳遞給sign_message函數,因爲符號函數需要通過sign key參數標識曲線域參數。

+0

非常感謝你,保羅:) – Ning