bech32 長度延伸突變弱點如何起作用?
p
可以修改以結尾的 bech32 地址,q
在最後一個字元之前插入或刪除字元p
,以生成新的有效 bech32 地址。為什麼這行得通?bech32還有其他類似的突變弱點嗎?
參考:
我將對這個問題提供更代數的解釋。
每個有效(和無效)的 Bech32 字元串都可以看作是變數x中的多項式,其中係數是 GF(32) 的元素。我將忽略下面的 GF(32) 部分,所以可以說它們只是從 0 到 31 的數字,具有奇怪的加法和乘法規則,保證每個操作始終保持在 0- 範圍內31.
數據部分(表示不包括人類可讀部分 (HRP) 和其後的“1”,但包括末尾的 6 個校驗和字元的字元串)使用包含在 BIP173 中的表格形式的字元集。例如,“q”表示 0,“p”表示 1,“3”表示 17,“l”表示 31。這些字元中的每一個都構成了多項式項的係數。我將在接下來的內容中忽略人類可讀的部分,因為這對問題無關緊要,但為了完整起見,HRP 還對多項式的係數進行編碼,但使用不同的(並且稍微複雜一些)翻譯。
例如,字元串“3qlp”對應於多項式17x 3 + 31x + 1。由於“q”代表 0,所以沒有x 2項。
現在,每個有效的 Bech32 字元串都對應一個多項式p(x) ,對於某些f(x),可以寫為p(x) = f(x)⋅g(x) + 1,其中g(x) = x 6 + 29x 5 + 22x 4 + 20x 3 + 21x 2 + 29x + 18。
為什麼那裡有*+ 1*?如果不是,那麼對於每個有效的p(x) = f(x)⋅g(x),x⋅f(x)⋅g(x) = x⋅p(x)也將是一個有效的多項式。由於乘以x只是在末尾添加一個 0(或“q”),這會讓任何人通過簡單地附加一個“q”而意外地將有效的 Bech32 字元串變異為不同的有效 Bech32 字元串。
然而,事實證明,添加*+ 1並不能完全解決這類問題。不可能再簡單地乘以x*,但是對於每個有效的p(x),對於任何i > 0的**x i ⋅(p(x) - 1) + 1仍然是有效的。如果p(x)恰好以“p”結尾,則對於某些e(x),它可以寫為x⋅e(x) + 1。在這種情況下,對於 i 的每個值,x i ⋅e (x) + 1也是一個有效字元串。在字元串形式中,這對應於在倒數第二個位置(就在最後的“p”之前)插入“q”字元。
類似地,如果p(x)恰好以“qp”結尾,對於某些e(x)和i > 1,它可以寫成x i ⋅e(x) + 1 。在這種情況下,xj⋅e(x) + 1其中j < i也是一個有效字元串。在字元串形式中,這對應於刪除倒數第二個位置的“q”字元(就在最後的“p”之前)。