Signature

簽名消息和DER簽名之間的R/S簽名關係

  • June 6, 2020

這一次我很難解釋我面臨的問題。我意識到 DER 簽名中的 R/S 簽名與比特幣簽名消息中的 1 不匹配?好的,下面是我說簽名的消息。

-----BEGIN BITCOIN SIGNED MESSAGE-----
c4ca4238a0b923820dcc509a6f75849b
-----BEGIN SIGNATURE-----
1BxqqjVC29fvCWin4qBuqZhBy4V7Ncdxby
       IPnTEOU713+XclrBrUEfTLeP0A7QIR4lObzQjBjyxGQExPwkalrQK1JOggIWk4xrfWIjHEC0RKGv3vtguDfto0o=
-----END BITCOIN SIGNED MESSAGE-----

我的工作方式是 $decoded_content = bin2hex(base64_decode(IPnTEOU713+XclrBrUEfTLeP0A7QIR4lObzQjBjyxGQExPwkalrQK1JOggIWk4xrfWIjHEC0RKGv3vtguDfto0o=))

然後我設法從 $decoded_content 獲取 R/S 簽名。之後,我使用 R/S 簽名生成 DER 簽名。我意識到這個 DER 簽名在簽名驗證中失敗。

簡而言之,

我的程序使用https://github.com/tuaris/CryptoCurrencyPHP/blob/master/Wallet.class.php#L225中的函式檢查有效簽名

如果另一方向我發送 DER 簽名,我如何將其轉換為 base64_encoded 字元串?所以最終我可以使用我剛才提到的功能。

我嘗試了很多方法但沒有運氣,簽名消息和 DER 簽名中的 R/S 簽名是否意味著相同?

請幫忙

比特幣交易使用 DER 格式作為簽名(加上 sighash 字節),但比特幣消息使用“普通”格式(又名 P1363、CVC、PKCS11、Microsoft、JWS 等)(加上恢復字節)。ECDSA中 r,s的計算(正如 Oscar 正確評論的那樣,這不是一個點)是相同的,但是為消息簽名的數據永遠不會與交易相同,因此簽名永遠不會實際上是相同的值。

您的簽名不應該也不是 DER 格式。您連結到的程式碼顯示正確:

   $signature = base64_decode($encodedSignature);

   $flag = hexdec(bin2hex(substr($signature, 0, 1)));

   $R = bin2hex(substr($signature, 1, 32));
   $S = bin2hex(substr($signature, 33));

這正確地解析了來自 base64 的純格式簽名(不是 DER)。

   $derPubKey = Signature::getPubKeyWithRS($flag, $R, $S, $hash);

在不追踪此呼叫的程式碼的情況下,它看起來應該恢復並編碼 pubkey;它是否也驗證簽名並不明顯。

引用自:https://bitcoin.stackexchange.com/questions/96287