Solidity

乙太坊 ecrecover 簽名驗證和加密

  • January 9, 2022

在這些問題中已經提出了使用 Solidity 簽名和驗證簽名的問題,這兩個問題我都曾嘗試研究過:

如何使用乙太坊地址的私鑰對數據進行簽名?

如何驗證由乙太坊地址密鑰對生成的加密簽名

但是,我似乎仍然缺少一些資訊。

首先,我想從關於簽名的問題開始。在範例中,字元串Schoolbus由 address0xd1ade25ccd3d550a7eb532ac759cac7be09c2719簽名,生成的簽名為0x2ac19db245478a06032e69cdbd2b54e648b78431d0a47bd1fbab18f79f820ba407466e37adbe9e84541cab97ab7d290f4a64a5825c876d22109f3bf813254e8601

到現在為止還挺好。現在,我想做的是使用ecrecover給定地址和數據的簽名確實是正確的來驗證。問題是,ecrecover需要四個參數:ecrecover(h, v, r, s). 除了h作為散列和{v, r, s}以某種方式組成簽名之外,v、r 和 s 究竟代表什麼?以及如何從單個字元串中獲取所有必要的值0x2ac19db245478a06032e69cdbd2b54e648b78431d0a47bd1fbab18f79f820ba407466e37adbe9e84541cab97ab7d290f4a64a5825c876d22109f3bf813254e8601

我所知道的是ecrecover返回一個地址,驗證簽名本質上是將結果地址與預期地址進行比較的問題。然而,整個過程似乎不必要地複雜。

除此之外,我還想知道如何生成一個簽名,無論是像這樣0x2ac19db245478a06032e69cdbd2b54e648b78431d0a47bd1fbab18f79f820ba407466e37adbe9e84541cab97ab7d290f4a64a5825c876d22109f3bf813254e8601還是一組{h, v, r, s}單獨使用 Solidity,而不像問題中的情況那樣繞道 RPC-JSON——只要我知道私鑰?

v、r 和 s 是可以從簽名中解析的參數。這是 ethereumjs utils 庫中的一個很好的例子:

 var sig = secp256k1.sign(msgHash, privateKey)
 var ret = {}
 ret.r = sig.signature.slice(0, 32)
 ret.s = sig.signature.slice(32, 64)
 ret.v = sig.recovery + 27

請注意如何解析給定簽名中的每個值。

即使您可以使用相同的私鑰簽署兩個不同的 msg,簽名過程(內部)會生成一個隨機 nonce 值 (k),該值用作計算的一部分,並且對於每個生成的簽名必須不同。

r 和 s 以及相關的公鑰有助於驗證簽名是否合法。

注意:我不是密碼學家。這就是我試圖回答您遇到的相同問題時所探勘的內容。我建議查看一些橢圓曲線的線上資源。

除了這個,我也想知道我怎麼能產生一個簽名,要麼這樣0x2ac19db245478a06032e69cdbd2b54e648b78431d0a47bd1fbab18f79f820ba407466e37adbe9e84541cab97ab7d290f4a64a5825c876d22109f3bf813254e8601或一組{H,V,R,S}用密實獨自一人,沒有RPC-JSON彎路如在問題的情況下 - 如果我知道私鑰?

您在 Solidity 中生成簽名的問題是您必須公開私鑰。或者,您可以使用許多橢圓曲線庫之一在正常的乙太坊交易過程之外生成簽名,並將生成的簽名發送到合約。

引用自:https://ethereum.stackexchange.com/questions/2256