Performance

k3d3/ed25519 字節的字節長度和偏移量變數?

  • November 20, 2016

我自己發現 java 的BigInteger速度非常慢,所以我試圖弱優化ed25519 的這個 java 實現,BigInteger如果成功,我將通過替換jscience來分叉和發布LargeInteger

我幾乎完成了將所有BigIntegers 轉換為LargeIntegers 的工作,但我仍然需要一個BigInteger’sand的等價物,並且我需要知道一些byte[]變數應該有多長以及它們valueOfbyte[]s 一起使用的偏移量。

我可以保留一些現有程式碼,只需BigIntegers 轉換為LargeIntegers,但我更願意完全替換BigInteger.

“長度 - 要讀取的最大字節數。” 聽起來我應該使用要轉換.length的。byte[]那是對的嗎?如果沒有,應該使用什麼?

“偏移量 - 開始讀取字節的偏移量。” 聽起來我應該使用0. 那是對的嗎?如果沒有,應該使用什麼?

我對二進制和密碼學是 100% 的新手。

幾乎每個 Java.valueOf(byte[] s, int offset, int length)都有相同的含義:

  • s是要讀取的數組。
  • offset是數組中開始讀取的位置(包括)。
  • length是要嘗試和讀取的字節數 - “嘗試”,因為數組可能不夠長,無法從offset.

記住 Java 數組是零索引的,.valueOf(z, offset, length)將從 到 的每個字節s[offset]讀取s[offset+length-1]。但是,如果offset+length > s.length,則從s[offset]to 的每個字節都s[s.length]將被讀取。

例如,如果我們有byte[] s = new byte[] {10, 20, 30, 15, 4},那麼:

  • LargeInteger.valueOf(s, 0, 5)將使用所有五個字節。
  • LargeInteger.valueOf(s, 1, 3)將使用字節{20, 30, 15}
  • LargeInteger.valueOf(s, 3, 7)將使用字節{15, 4}

在 Ed25519 中,您使用的長度和偏移量將取決於字節的哪一部分

$$ $$你需要訪問。例如,最初您獲取一個種子k並對其進行雜湊處理以獲得h = H(k),然後將其拆分為 LHS 和 RHS。您可以將 LHS 和 RHS 分別轉換為LargeIntegersLargeInteger.valueOf(h, 0, b/8)用於 LHS 和LargeInteger.valueOf(h, b/8, b/4-b/8)RHS。 所以最終的答案是,在大多數情況下是的,你會使用offset = 0and length = s.length。看起來您可以直接替換BigInteger.valueOf()LargeInteger.valueOf().

引用自:https://crypto.stackexchange.com/questions/13073