如何調整 bip340_test_vectors 以檢查其他測試向量的簽名驗證是否失敗?
我現在明白為什麼有些
bip340_test_vectors
簽名驗證失敗了。我想調整這些測試向量以檢查其他測試向量的簽名驗證是否失敗。我該怎麼做呢?
免責聲明:這是一項教育活動。此 Python 程式碼用於測試,不應用於生產或與主網比特幣一起使用。的私鑰
3
是絕對不安全的。BIP 儲存庫中有兩個 Python 文件
reference.py
,test_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)
您可以將秘密從 更改
3
為4
。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 的一些補充。