Secp256k1

C secp256k1:未壓縮的公鑰中的前綴 0x06 和 0x07 表示什麼?

  • August 10, 2017

eckey_impl.h標頭檔中,執行secp256k1_eckey_pubkey_parse檢查 65 字節公鑰的第一個字節是0x04,0x06還是0x07. 我在哪裡可以找到有關0x060x07前綴的文件?

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,我們將面臨網路共識失敗的風險。現在我們幾乎被它困住了。

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