Aes
AES 中使用的 MDS 矩陣是如何選擇的?
$$ \begin{pmatrix}2&3&1&1\ 1&2&3&1\ 1&1&2&3\ 3&1&1&2\end{pmatrix} $$ 上面AES加密中使用的MDS矩陣,為什麼是數字 $ 2 $ , $ 3 $ 和 $ 1 $ 選擇?為什麼沒有其他號碼?
之所以選擇它們,是因為它們是使矩陣MDS和循環的最小的非零元素。對於 MDS 矩陣,如果單個輸入發生變化,則所有輸出都會發生變化。
將矩陣乘以一個值時,您需要將輸入字節乘以有限域中的矩陣值。這些乘法的計算成本與矩陣值的大小有關,因此使它們盡可能小是效率的設計標準。
乘以 1 是顯而易見的,但在 AES 使用的有限域中,乘以其他任何值是不同的,因為您將值視為多項式。
實現時,乘以 2 是帶有條件 XOR 的左移,乘以 3 是乘以 2 加上與原始值的 XOR。其他更大的數字需要更多的操作。使矩陣循環還可以實現高效運算,因為您只需要對每個輸入元素執行一次乘法運算,其餘的都是 XOR。
乘法也可以提前完成,然後使用表查找,但這對於 RAM 和 ROM 非常低的設備來說並不好。當表查找實現既不是最優的也不是不可能的時候,讓元素變小可以保持良好的性能。
Fugue 散列函式中使用了一個類似的循環 MDS 矩陣,其值為 1、1、7、4,每個輸入元素需要 2 次乘法。Twofish 在非循環矩陣中使用 1,91,239。