簽名消息和DER簽名之間的R/S簽名關係
這一次我很難解釋我面臨的問題。我意識到 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;它是否也驗證簽名並不明顯。