Salsa20雜湊函式如何實現?
我目前正在實施規範中的 Salsa20,作為學習和自我鞭撻的練習。
我的第 1-7 節通過了提供的測試範例。我現在被困在第 8 節,Salsa20 雜湊函式(第 6 頁):
1)令人困惑的是雙輪 $ ^1 $ $ ^0 $ . 這到底是什麼意思?執行雙輪函式 $ 10 $ 次在 $ x $ 之前的話?即我執行雙輪( $ x $ )一次,然後將結果再次輸入到doubleround函式中,然後再重複 8 次?
2)之後它會做一個littleendian $ ^- $ $ ^1 $ ( $ z0 + x0 $ ) . 我知道littleendian函式是什麼,正如之前在第 7 節中定義的那樣。但是什麼是littleendian $ ^- $ $ ^1 $ ? 它的反面?我是否只是通過 $ z0 $ 和 $ x0 $ 再次添加回正常的littleendian函式(作為副產品會反轉 littleendian 函式的結果)?
3)要產生最終輸出,我是否連接 littleendian 的 16 個字(每個字 4 個字節**) $ ^- $ $ ^1 $** 一起函式,然後將它們轉換為字節以獲得生成的 64 字節序列?
也許一些虛擬碼會更簡潔地回答這些問題。
謝謝朋友。
您對 10 次冪的解釋是正確的:它是十倍的迭代。所以我們應用這個函式 10 次,從 $ x $ ,將輸出作為下一步的輸入。像 C 一樣(我為 16 個單詞的向量寫 x $ x_0,\ldots,x_{15} $ ):
y=x; for (i=0; i< 10; i++){ y = doubleround(y) }; return y
little-endian 的反轉確實是將一個字(32 位)以 little endian 方式發送回 4 字節序列的函式,因此最低有效字節在前,最高有效字節在最後。所以它映射 $ w $ 至
w & 0xff, (w >> 8) & 0xff, (w >> 16) & 0xff, (w >> 24) & 0xff
最後,迭代為您提供了一個包含 16 個單詞的向量,您可以按與原始輸入向量相同的順序將其添加到組件中。然後以相同的順序再次將它們轉換為字節,並且以上述小端方式將每個單詞轉換為字節。(我們也可以先將它們轉換為字節(使用 litleenian 的倒數),然後按順序進行 64 字節加法,但這效率較低,因為我們隨後進行 64 字節加法而不是 16 字加法)。