DES 中的外部數據載入
嘗試編寫實現 DES 標準 (FIPS 46-3) 的 C 程序。關於算法中載入的外部數據,我不確定在計算文件中指定的各種排列時應該如何解釋標準。
例如,IP(初始排列)採用 64 位輸入並排列它們,以便結果將輸入的第 58 位作為其第一位,將第 50 位作為其第二位,依此類推。
假設(這是正確的嗎?)輸出的“第一位”表示 MSB,問題仍然存在於輸入的“第 58 位”的含義。我們從哪裡開始計數?
例如,如果輸入是從 8 字節緩衝區(C 數組)中的文件讀取的,則要找到的第 58 位在哪裡:在緩衝區中
$$ 0 $$或在緩衝區$$ 7 $$? 兩者似乎都是合理的:在緩衝區$$ 0 $$(因為邏輯上是行中的最後一個,假設它是首先讀取的)並且在緩衝區中$$ 7 $$(假設我們相信我們正在讀取一個以其 MSB 開頭的整數)。 社區對此問題的共識是什麼?
謝謝你。
所有關於 DES 的標准文獻,包括FIPS 46-3,數據位從 1 開始表示讀取順序中第一個字的最高有效位,當我們進入低位時遞增 1,然後移動到下一個字每個字長的倍數,以位為單位。這裡的字可以是 8 位(用於數據和密鑰)、32 位(由 L/R 形成的狀態)、28 位(由 C/D 形成的內部密鑰)。
對於在索引 0 到 7 處操作 8 字節數組作為 IP 輸入的實現者,位 $ i $ 用於索引處的字節 $ \left\lfloor(i-1)/8\right\rfloor $ 並且有重量 $ 2^{(-i)\bmod 8} $ . 在 C 中,它可能是可測試的
Buffer[(i-1)>>3] & (128>>((i-1)&7))
第 58 位屬於 8 個字節中的最後一個,
Buffer[7]
權重為 64 (0x40
)。
DES 標準是一種互操作性標準,描述了與IBM 專利中的硬體實現的兼容性。
初始排列描述了取 8 個輸入字節位,按 1 到 8 位排序,其中 1 具有最大的二進制權重,並提供由偶數和奇數輸入字節位組成的初始 LR 塊。
以 1 到 8 ms 到 ls 表示法的輸入字節位的二進制權重將表示為 (1 << 8 - x),其中 xa 值在 1 到 8 範圍內,並且 - 運算符的優先級高於 << 運算符.
請注意,例如在程式語言 C 中,字節大小的 char 中的位將被標記為 7 到 0,而不是像這裡那樣從 1 到 8。
逆初始置換正好相反,同時還包括輸出塊重新排序到 RL。請注意,IP-1 表在此處顯示為順時針旋轉 90 度。
從硬體的角度來看,您可以通過將兩個 32 位寄存器由四個 8 位移位寄存器組成的串列移位來在左右寄存器中載入 8 個連續字節。(對於最簡單的 DES 實現,這些寄存器也並行載入。)
Inverse Initial Permutation 將結果串列地移出到一個字節寬的介面。在實現字節寬介面時,兩種排列都包含 8 根線。
Permuted Choice 1 對載入到 28 位 C 和 D 塊中的密鑰執行類似的操作。
我們再次得到 8 根線來描述使用 7 個輸入字節位的排列。PC-1 表在此處重新對齊到 8 個連續的輸入字節。請注意,輸入字節第 4 位被移入 C 和 D 塊的連接的最後 4 位。
對於您關於初始排列的問題,“……要找到的第 58 位在哪裡:在緩衝區中
$$ 0 $$或在緩衝區$$ 7 $$?” 答案是緩衝區$$ 7 $$,對應於序列中的第 8 個輸入字節,假設緩衝區是一個 char 值數組。 正如所評論的,這不是共識問題。標準是具體的。還發布了已知的三元組值(測試向量)以及已知的一致性實現。請參閱64 DES 完整範例的答案,其中所有階段都描述了可用於直接比較的一致實現以及三元組值的來源。