Modular-Arithmetic
Salsa20 實施:抑制進位的 2 個單詞的總和
我正在研究 Salsa20 規範的第二部分,我想為兩個單詞(u32)的異或實現一個閉包。作者將運算定義為帶有抑制的兩個單詞的總和,但是“抑制的攜帶”是什麼意思?然後我遇到了一些求和符號:
$ u=\sum_i2^iu_i $
在這種情況下,變數“i”到底是什麼意思?我了解求和符號和索引變數,但規範的上下文不夠詳細,我無法知道“i”索引是什麼。
我意識到這一切可能都非常初級,但我首先是一名程序員。
帶有抑制的兩個單詞的總和只是一種複雜的異或說法。您不需要實現任何復雜的求和操作。只需執行按位異或。我不知道伯恩斯坦為什麼如此深奧。任何可能正在閱讀他的論文的密碼學家都不會需要對在該領域中無處不在的東西進行複習,例如析取。
如果您正在執行模加法,就像紙筆算術一樣,您需要使用進位。添加二進制時,您正在執行相同的操作,但每個數字都取模 2 而不是取模 10。
1 1 ⟵ carries 0 0 0 1 0 0 1 1 + ⸻⸻ 0 1 0 0
我們看到十進制 1(二進制 0001)加上十進制 3(二進制 0011)等於十進制 4(二進制 0100)。也就是說,1 + 3 = 4。那麼,如果我們去掉進位會發生什麼,即在二進制中執行無進位加法?
0 0 0 1 0 0 1 1 ⊕ ⸻⸻ 0 0 1 0
這與十進制 1 與十進制 3 異或相同,結果是十進制 2 (0010)!所以 1 ⊕ 3 = 2。Salsa20 做同樣的事情,但使用 32 位字而不是 4 位字。因為加法是模 2 32,所以最左邊的進位,如果有的話,總是被抑制(第33位沒有空間)。