簡單聊聊ECDSA與Ethereum的sign message
本篇不會牽涉到數學公式或是算法,只是簡單解釋格式上的差異 在我們應用中,會有兩個場景需要對訊息做簽章的動作,一個是簽章完送到smart contract裡用ecrecover做身份確認,另一個是單純把訊息(例如:個人資料)做簽章,確保訊息確實是本人的(就像簽名一樣)。 我們產品中會有iOS, Android或是後端的C#或JAVA,每種語言對ECDSA的使用方式都有所不同,有原生也有third party library,加上Web3也有提供sign message的功能,一開始大家一知半解,不太知道差異,所以在開發的時候,搞得人仰馬翻。 本篇就是針對標準ECDSA跟Web3提供的sign message做一點“ 簡單” 的解釋 。 首先,你要先知道 r s v,不用知道他背後的意義(因為我也不清楚 XD),但是你需要知道sign(本篇的sign都是指ECDSA)過的message可以被分解為 r s,咦?! 說好的 v 勒?? 先破題, 這就是標準ECDSA跟Ethereum用來可以recover signed message的差異 (其實Ethereum是沿用Bitcoin的)。 在ECDSA sign完的訊息可以分解成 r 跟 s ,不過只靠rs所反解的public key會有四組,不過實際上大家都只看兩組,因為另外兩組出現機率很低, 這篇解答 中的推文有解釋。 27 = lower X even Y. 28 = lower X odd Y. 29 = higher X even Y. 30 = higher X odd Y. Note that 29 and 30 are exceedingly rarely, and will in practice only ever be seen in specifically generated examples. There are only two possible X values if r is between 1 and (p mod n), which has a chance of about 0.0000000000000000000000...