Bitcoin-Core

為什麼簽名總是 65 (1+32+32) 字節長?

  • August 7, 2013

Bitcoin-Qt 客戶端創建的簽名始終可以解碼(base64)為 65 字節數組。這個數組似乎(根據<https://github.com/bitcoin/bitcoin/blob/master/src/key.cpp#L217>)包含一個標題字節、一個 32 字節的 R 部分和一個 32 字節的 S 部分.

我從一些以 DER 格式編碼的 ECDSA 簽名中提取了一些 (R,S) 對。我發現 R 和 S 的大小不一定是 32 字節。它們有時可以是 33 個字節長。誰能告訴我為什麼 Qt 客戶端創建的簽名總是 65 字節,或者總是將 R 和 S 都轉換為 32 字節數組是否可以?謝謝。

使用了兩種不同的編碼。

比特幣協議中的所有內容,包括交易簽名警報簽名,都使用DER 編碼。這會產生 71 個字節的簽名(平均而言),因為有幾個標頭字節,並且 R 和 S 的值是可變長度的。

對於消息簽名,使用更緊湊(並且更新)並支持公鑰恢復的*自定義編碼(給定消息和簽名,找到哪個公鑰會創建它)。*您在問題中提到的程式碼是用於創建此類簽名。

正確的 DER 編碼簽名具有以下形式:

  • 0x30: 表示複合結構的頭字節。
  • 以下所有內容的 1 字節長度描述符。
  • 0x02: 表示整數的頭字節。
  • R 值的 1 字節長度描述符
  • R 座標,作為大端整數。
  • 0x02: 表示整數的頭字節。
  • S 值的 1 字節長度描述符。
  • S 座標,作為大端整數。

0x00不允許 R 和 S 的初始字節,除非它們的第一個字節否則會在上面0x7F(在這種情況下0x00,前面需要一個單字節)。另請注意,在交易簽名內部,一個額外的 hashtype 字節跟隨實際簽名數據。

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