Go-Ethereum

為什麼在 secp256k1 簽名之前填充 privateKey?

  • February 21, 2020

我正在檢查乙太坊如何處理簽名,但我無法弄清楚為什麼這math.PaddedBigBytes是必要的:

func Sign(digestHash []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) {
   if len(digestHash) != DigestLength {
       return nil, fmt.Errorf("hash is required to be exactly %d bytes (%d)", DigestLength, len(digestHash))
   }
   seckey := math.PaddedBigBytes(prv.D, prv.Params().BitSize/8)
   defer zeroBytes(seckey)
   return secp256k1.Sign(digestHash, seckey)
}

它是否必須為了生成 65 字節的 sig 長度而做某事?

他們獲取私鑰prv.D並將零填充到密鑰的最高有效字節,以便它具有正確的長度,如prv.Params().BitSize(bits) 或prv.Params().BitSize./8(Bytes) 中指定的那樣。在這種情況下,由於我們使用曲線 secp256k1,所以我們總是將私鑰填充到 32 字節長度。

例子:

真正的私鑰是 0040408ca91387a405889c367fd2dc38884a15e45d7ac910bbe3db46d9b82fe5

看起來,創建該程式碼的開發人員認為它可以在最重要的字節被截斷的情況下儲存。如果您將私鑰解釋為數字,則可能會發生這種情況,因為在這種情況下,最高有效(零)字節不會更改數字的值。

prv.D = 40408ca91387a405889c367fd2dc38884a15e45d7ac910bbe3db46d9b82fe5

seckey := math.PaddedBigBytes(prv.D, prv.Params().BitSize/8)

seckey=0040408ca91387a405889c367fd2dc38884a15e45d7ac910bbe3db46d9b82fe5

編輯:更改了 prv.D 中的錯字

引用自:https://ethereum.stackexchange.com/questions/80006