Serpent S-box 是如何工作的?
**警告:**答案中的連結很好地解釋了 S-Box,但虛擬碼中有錯誤。
$ K_i = K_{i-8} \oplus K_{i-5} \oplus K_{i-3} \oplus K_{i-1} \oplus 0x9e3779b9 \oplus i $ ;
相反,它應該是: $ K_i = K_{i-8} \oplus K_{i-5} \oplus K_{i-3} \oplus K_{i-1} \oplus 0x9e3779b9 \oplus (i-8) $ ;
循環從 8 開始,但在論文中, i 值 0 作為循環的開始。
對於 DES,您將 4 個內部位作為從 S-Box 中選擇的列,並將兩個外部位作為行選擇。
但是,對於 Serpent 來說,這對我來說沒有意義,因為用於選擇行和列的預鍵是 32 位字,而 8 個 S-box 是一維數組。
現在論文告訴我們 S-box 是 4 位排列,但這是什麼意思?這是否意味著兩個外部位用於選擇 8 個 S-box 之一,而 4 個內部位(因此忽略過程中的 2 個位)將用於列?但是,論文直接指定使用哪個 S-box,如下所示:
$ {k_0 , k_1 , k_2 , k_3 } := S_3 (w_0 , w_1 , w_2 , w_3) $
我在網上搜尋過,但 serpent 似乎不像 Rijndael 或 DES 那樣有文件記錄。
Serpent 共使用了 8 個不同的 4 位 S-box(即每個 S-box 包含 16 個元素)共 32 次。沒有“行”或“列”,因為它是一個包含 16 個元素的一維數組。對於每個 S-box,將一個 0 到 15 的 4 位整數映射到另一個 0 到 15 的 4 位整數。當將 S-box 實現為數組時,輸入用作索引,並將其內容數組是組成 S-box 本身的東西。輸出只是輸入給定索引處的元素。
下表描述了 8 種不同的 Serpent S-box(忽略逆 S-box): $$ \begin{equation} \begin{array}{|c|c|c|c|c|c|c|c|c|} \hline \text{Input}&\operatorname{S_0}&\operatorname{S_1}&\operatorname{S_2}&\operatorname{S_3}&\operatorname{S_4}&\operatorname{S_5}&\operatorname{S_6}&\operatorname{S_7}\ \hline 0&3&15&8&0&1&15&7&1\ 1&8&12&6&15&15&5&2&13\ 2&15&2&7&11&8&2&12&15\ 3&1&7&9&8&3&11&5&0\ 4&10&9&3&12&12&4&8&14\ 5&6&0&12&9&0&10&4&8\ 6&5&5&10&6&11&9&6&2\ 7&11&10&15&3&6&12&11&11\ 8&14&1&13&13&2&0&14&7\ 9&13&11&1&1&5&3&9&4\ 10&4&14&14&2&4&14&1&12\ 11&2&8&4&4&10&8&15&10\ 12&7&6&0&10&9&13&13&9\ 13&0&13&11&7&14&6&3&3\ 14&9&3&5&5&7&7&10&5\ 15&12&4&2&14&13&1&0&6\ \hline \end{array} \end{equation} $$
這意味著整數 $ 9 $ (二進制 $ 1001 $ ) 通過第 3 個 S 盒 ( $ \operatorname{S_2} $ ) 將是索引 9 處的元素,恰好是整數 $ 1 $ (二進制 $ 0001 $ )。換句話說, $ \operatorname{S}2[9] = 1 $ . 在任何給定回合中使用的 S-box 由回合數決定。圓形的 $ r $ 用途 $ \operatorname{S}{r\bmod 8} $ . Serpent 作者決定使用 8 個不同的 S-box 而不是 32 個,因為安全優勢似乎不值得增加 ROM 佔用空間,而且對於這麼小的 S-box 來說,不到 8 個是不安全的。
每個 4 位 S-box 對 4 位輸入塊進行操作,返回 4 位輸出塊。每一輪的替換步驟涉及同一個 S-box 的 32 次並行應用。這種替換進行了 32 次(每輪一次)。這是通過將 128 位塊拆分為四個 32 位字來實現的。每個字的第一位用作第一個 S-box 的輸入。每個字的第二位用作第二個 S-box 的輸入。這種情況持續了 32 次。由於總是有四個字,每個 S-box 只需要 4 位輸入。以下內容來自一篇關於 Serpent 實現的部落格文章,該文章解釋了 4 位 S-box 如何能夠對四個 32 位字(即 128 位循環狀態)進行操作:
下圖顯示了 s-box 是如何在位片模式下實現的。128 位輸入塊被分成 4 x 32 位字:|w0|w1|w2|w3|。然後如圖所示排列。然後通過取 32 個切片,每個切片 4 位,然後並行放置 32 個 s-box 副本來應用替換。位 0 是 4 位值中的 lsb。