根據 RFC8032 解碼 Ed25519 密鑰
RFC8032 Edwards-Curve 數字簽名算法 (EdDSA) 5.1.3 解碼說明如下:
解碼一個點,作為一個 32 字節的字元串,有點
複雜。
- 首先,將字元串解釋為 little-endian 表示的整數。這個數字的第 255 位是 x 座標的最低有效位,表示這個值 x_0。只需清除該位即可恢復 y 座標。如果結果值 >= p,則解碼失敗。
我的問題是…
- 32 個八位字節是 256 位。我假設第一位的索引是 0 而不是 1,這將使 255 成為最後一位。那麼為什麼不說它是最後一位而不是第 255 位呢?
- 引用上一節,“為了形成點的編碼,將 x 座標的最低有效位複製到最後一個八位字節的最高有效位。 ”。所以編碼我們設置最高有效位並解碼我們查看最低有效位?所以我們看的不是同一個位?這對我來說沒有多大意義。
- 當您將字元串解釋為整數時,我假設您應該以二進制的恭維來解釋它?例如。如果第一位是 1,那麼你假設這個數字是負數?RFC根本不清楚恕我直言..
我假設第一位的索引是 0 而不是 1,這將使 255 成為最後一位。
是的。第 2 節末尾的範例清楚地說明了這一點,顯示從 0 開始編號的位。在此 RFC 中, 當按照美國對樓層的方式以及許多其他標準對位進行編號的方式對事物進行編號時,
i'th bit
實際上是第 (i
+1)位. 我適應多樣性而不是對抗它,這很懦弱,但讓生活更輕鬆。當您將字元串解釋為整數時,我假設您應該以二進制的恭維來解釋它?
符號在解碼為整數之後出現。同樣的第 2 節指出整數是非負的並且具有無符號表示,第 3.1 節說明如何對 GF(p) 的“負”元素進行編碼:
GF(p) 的編碼用於定義 GF(p) 的“負”元素:具體而言,如果 x 的 (b-1) 位編碼在字典上大於 (b-1) 位,則 x 為負-x 的編碼。
我的大腦很難解析:如果 $ x $ 為負,則 $ (b-1) $ -位編碼 $ x $ (該聲明似乎試圖定義)尚未定義,這使得定義充其量是自我參照的,最壞的情況是荒謬的。我得到“字典順序”與小端序的結合意味著低位位在比較中最重要。
Ed25519論文在標準的那部分有一些東西,有 $ \mathbf F_q $ 有標準的地方
GF(p)
,其次是有幫助的如果 $ q $ 是一個奇數素數,編碼是小端表示 $ {0,1,\dots,q-1} $ 然後是負面元素 $ \mathbf F_q $ 是 $ {1,3,\dots,q-2} $ .
一個元素 $ x\pmod p $ of
GF(p)
被定義為負當且僅當 $ ((x\bmod p)\bmod 2)=1 $ 其中兩個參數運算符 $ \bmod $ (可以通過在其左側沒有左括號來辨識)產生小於其第二個參數的非負整數;和那個數量 $ ((x\bmod p)\bmod 2) $ 是作為備用位儲存的內容。因此,在問題的引文和接下來的內容中,第一個 $ (b-1) $ 的位 $ b $ 點的位表示 $ (x,y) $ 曲線上是 $ y $ , little-endian, 被認為是一個非負整數;最後一位(最後一個字節的高位)定義了符號 $ x $ . 所述方法足以完全恢復 $ y $ 然後 $ x $ 作為 的元素
GF(p)
,因此是點。