Public-Key

DER簽名和SEC格式是什麼

  • May 22, 2020

我經常在比特幣文件和教程中看到這兩個元素,但我還沒有在網際網路上找到 DER 簽名和 SEC 格式的正確定義。

可分辨編碼規則 (DER) 格式用於對比特幣中的 ECDSA 簽名進行編碼。ECDSA 簽名是使用私鑰和簽名消息的雜湊生成的。它由兩個 32 字節的數字組成(r,s)。正如Pieter 在此處所描述的,DER 簽名格式具有以下組件:

  1. 0x30byte:標頭字節,表示複合結構
  2. 一個字節來編碼以下數據的長度
  3. 0x02: 表示整數的頭字節
  4. 一個字節來編碼以下r值的長度
  5. r大端整數形式的值
  6. 0x02: 表示整數的頭字節
  7. 一個字節來編碼以下s值的長度
  8. s大端整數形式的值

請注意,如果它們的第一個字節大於,則rands值必須在前面加上。在值位於範圍的上半部分(稱為“高”)的情況下,這會導致可變的簽名長度。具有高值的簽名是非標準的,通常不會出現在野外。另請注意,在極少數情況下or可以短於 32 個字節,這是合法的,並且會導致簽名更短。請注意,在比特幣交易中,在 DER 簽名的末尾添加一個字節,表示使用的 SigHash 類型。0x00``0x7F``r``r``sr``s

證監會

高效加密標準 (SEC) 編碼用於序列化 ECDSA 公鑰。比特幣中的公鑰是由兩個座標組成的 ECDSA 點(x,y)x並且y可能小於 32 字節,在這種情況下,它們必須用 0 填充到 32 字節(H/T 編碼愛好者)。比特幣使用兩種格式,未壓縮和壓縮:

未壓縮:

  1. 0x04byte:標頭字節,指示 ECDSA 點
  2. 座標為x32 字節大端整數
  3. 座標為y32 字節大端整數

壓縮:

由於座標(x,y)必須滿足 secp256k1 曲線方程,因此可以從該值計算出y² = x³ + 7的兩個可能值。因此,我們可以將公鑰表示為與要使用兩個值中的哪一個的指示符組合的座標。y``x``x``y

  1. 0x02/ 0x03byte:頭字節,表示壓縮的ECDSA點,0x02為偶數y0x03為奇數y
  2. 座標為x32 字節大端整數

以上內容在Jimmy Song 的 Programming Bitcoin: Ch4中有更全面的解釋。序列化

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