Secp256k1
C secp256k1:未壓縮的公鑰中的前綴 0x06 和 0x07 表示什麼?
在
eckey_impl.h
標頭檔中,執行secp256k1_eckey_pubkey_parse
檢查 65 字節公鑰的第一個字節是0x04
,0x06
還是0x07
. 我在哪裡可以找到有關0x06
和0x07
前綴的文件?static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size) { if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { secp256k1_fe x; return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == 0x03); } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { secp256k1_fe x, y; if (!secp256k1_fe_set_b32(&x, pub+1) || !secp256k1_fe_set_b32(&y, pub+33)) { return 0; } secp256k1_ge_set_xy(elem, &x, &y); if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) { return 0; } return secp256k1_ge_is_valid_var(elem); } else { return 0; } }
這些用於“混合”公鑰格式,這是一種未壓縮格式(它同時具有 X 和 Y 座標,如 0x04),仍儲存 Y 座標的奇數/偶數(如 0x02/0x03)。
它在 ANSI X9.62-1998 第 4.3.6 和 4.3.7 節中定義,對我來說似乎完全沒用。然而,OpenSSL 支持它,因此當切換到 libsecp256k1 進行驗證時,它也必須支持它,否則如果使用這樣的 pubkey,我們將面臨網路共識失敗的風險。現在我們幾乎被它困住了。