Bitcoin-Core-Development

如何調整 bip340_test_vectors 以檢查其他測試向量的簽名驗證是否失敗?

  • October 14, 2020

我現在明白為什麼有些bip340_test_vectors簽名驗證失敗了。

我想調整這些測試向量以檢查其他測試向量的簽名驗證是否失敗。我該怎麼做呢?

免責聲明:這是一項教育活動。此 Python 程式碼用於測試,不應用於生產或與主網比特幣一起使用。的私鑰3是絕對不安全的。

BIP 儲存庫中有兩個 Python 文件reference.pytest_vectors.py您可以通過複製 BIP 儲存庫來查看它們。

git clone https://github.com/bitcoin/bips.git

這兩個文件在/bitcoin/bips/tree/master/bip-0340.

如果您python3 test-vectors.py從 bip-0340 目錄中執行,您將獲得 CSV 文件中的輸出和錯誤消息test-vectors.csv

如果您test-vectors.py使用文本編輯器打開,例如vim test-vectors.py

您可以編輯任何測試向量的密鑰(私鑰)、消息、輔助隨機性。

例如vector0有密鑰3

seckey = bytes_from_int(3)

您可以將秘密從 更改34

seckey = bytes_from_int(4)

保存並關閉您的文本編輯器,然後python3 test-vectors.py再次執行。

這將產生一個 AssertionError。

Traceback (most recent call last):
 File "test-vectors.py", line 253, in <module>
   vector0(),
 File "test-vectors.py", line 31, in vector0
   assert(not has_square_y(pubkey_point))
AssertionError

有一個斷言檢查特定公鑰 (X,Y)(根據秘密(私鑰)密鑰計算)的 Y 座標不是正方形的。這是由於先前的設計決定使用平方作為兩個 Y 座標的決勝局而實施的檢查。決勝局現在是均勻度而不是平方度。包含此測試以擷取實施者錯誤地使用平方而不是均勻度。在這種情況下,公鑰具有方形 Y 座標。

每個私鑰(標量)映射到一個對應的公鑰(點)。在 BIP 340 中,我們將自己限制為具有偶數 Y 座標的公鑰。這可能導致只有一半的公鑰有效,因此也只有一半的私鑰有效。相反,我們說每個私鑰都有一個公鑰,如果d.G有一個奇數的 Y 座標,我們有效地用 -d (否定的私鑰)簽名。

否定意味著取群階 n 的補碼

-m = n-m (mod n)

通過這種更改,您可以說每個標量都是有效的私鑰,但是有兩個私鑰映射到同一個公鑰。但是,只有一個私鑰映射到具有偶數 Y 座標的公鑰。(只有一個 BIP 340 私鑰映射到 BIP 340 公鑰。)

請記住,當您完成實驗後,您可以使用它來重置:

git reset --hard HEAD

這將放棄您所做的更改並返回到您開始試驗之前的程式碼狀態。

感謝 IRC 上的 Pieter Wuille 的一些補充。

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