Transactions

ECDSA r, s 編碼為簽名

  • December 27, 2020

簽名給定消息時的 ECDSA 算法會產生一對輸出r 和 s。給定來自 Tx 的 sigStr,如何提取 r 和 s?它們只是連接特定長度的字節數組,還是還有更多?

如果您願意,您可以為標準ANSI X9.62支付 100 美元。或者,您可以作弊並查看RFC3278,第 8.2 節。它是 DER 格式,由兩個 INTEGER 的 SEQUENCE 組成。第一個 INTEGER 是r,第二個s

如果您查看此交易,您會看到其中一個簽名是:

3045 0220

316eb3cad8b66fcf1494a6e6f9542c3555addbf337f04b62bf4758483fdc881d

022100

bf46d26cef45d998a2cb5d2d0b8342d70973fa7c3c3242ae7223146b56

如果我們將其解析為 DER,我們會得到:

0:d=0  hl=2 l= 69 cons: SEQUENCE          
2:d=1  hl=2 l= 32 prim: INTEGER :316EB3CAD8B66FCF1494A6E6F9542C3555ADDBF337F04B62BF4758483FDC881D
36:d=1  hl=2 l= 33 prim: INTEGER :BF46D26CEF45D998A2CB5D2D0B8342D70973FA7C3C37AE72234696524B2BC812

您還可以查看 OpenSSL 原始碼,文件ecdsa/ecs_asn1.c

ASN1_SEQUENCE(ECDSA_SIG) = {
       ASN1_SIMPLE(ECDSA_SIG, r, CBIGNUM),
       ASN1_SIMPLE(ECDSA_SIG, s, CBIGNUM)
} ASN1_SEQUENCE_END(ECDSA_SIG)

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