k3d3/ed25519 字節的字節長度和偏移量變數?
我自己發現 java 的
BigInteger
速度非常慢,所以我試圖弱優化ed25519 的這個 java 實現,BigInteger
如果成功,我將通過替換jscience來分叉和發布LargeInteger
。我幾乎完成了將所有
BigInteger
s 轉換為LargeInteger
s 的工作,但我仍然需要一個BigInteger
’sand
的等價物,並且我需要知道一些byte[]
變數應該有多長以及它們valueOf
與byte[]
s 一起使用的偏移量。我可以保留一些現有程式碼,只需將
BigInteger
s 轉換為LargeInteger
s,但我更願意完全替換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 分別轉換為LargeInteger
sLargeInteger.valueOf(h, 0, b/8)
用於 LHS 和LargeInteger.valueOf(h, b/8, b/4-b/8)
RHS。 所以最終的答案是,在大多數情況下是的,你會使用offset = 0
andlength = s.length
。看起來您可以直接替換BigInteger.valueOf()
為LargeInteger.valueOf()
.