\(\Zn{n}\):會「繞回」的整數(講義 p. 2)

令 \(n\) 為正整數。是集合 \[\Zn{n}=\{0,1,\dots,n-1\},\] 其上的加法與減法和整數 \(\Z=\{\dots,-2,-1,0,1,2,\dots\}\) 一樣,只是結果要再取除以 \(n\) 的餘數(記作 \(\bmod n\)),使它落回 \(\{0,\dots,n-1\}\)。 更一般地,兩個整數 \(a,b\) 稱為,記 \(a\equiv b\pmod n\),若 \(n\mid(a-b)\);\(\Zn{n}\) 的每個元素就是一整類同餘的整數的「代表」。

講義的例子(\(n=5\)):\(1-4=-3\equiv2\)、\(2+2=4\)、\(3+4=7\equiv2\pmod 5\)。 要點是負數也要繞回:\(-3\) 加上 \(5\) 得 \(2\)。一般地,\(x\bmod n\) 永遠取 \(\{0,\dots,n-1\}\) 中的那個代表。

Python 的 得 (與數學一致),但 C、C++、Java、JavaScript 的 得 (餘數跟著被除數的正負號走)。 寫解密 \(m_i=c_i-\sk\) 時,這是最常見的 bug 來源;安全寫法是 。

模算術像整數算術(講義 p. 3)

講義列出 \(\Zn{n}\) 上加法的四條性質,它們合起來就是代數裡「」的定義:

L3.0cmL5.2cmL6.2cm 性質 & 式子(對所有 \(x,y,z\in\Zn{n}\)) & 對密碼的意義
單位元(identity) & \(x+0=0+x=x\) & 金鑰 \(0\) 是「什麼都不做」的金鑰(但它仍是合法金鑰,見 §[sec:p2] (v))
反元素(inverse) & 對每個 \(x\) 存在 \(-x\) 使 \(x+(-x)=0\);\(-x=n-x\) & 加金鑰可以被「減金鑰」完全抵銷:這就是 \(\Dec\) 存在的理由
交換律(commutative) & \(x+y=y+x\) & 先加訊息再加金鑰、或反過來,結果一樣
結合律(associative) & \((x+y)+z=x+(y+z)\) & 多次加密/解密可以任意結合,例如 \((m+\sk)-\sk=m+(\sk-\sk)=m\)

三個理由: (1) 封閉性——字母加字母還是字母,所以 \(\calC=\calM\),密文不會跑出字母表; (2) 可逆性——每個加法都有反元素,所以「加 \(\sk\)」是 \(\Zn{n}\) 上的雙射(Week 2:\(\Esk\) 必須單射),解密就是加 \(-\sk\); (3) 均勻性——若 \(\sk\) 在 \(\Zn{n}\) 上均勻,則對任何固定的 \(m\),\(m+\sk\) 也在 \(\Zn{n}\) 上均勻。第三點是 §[sec:perfect] 完美保密證明的全部內容。

\(n=26\):字母的算術(講義 p. 4)

講義約定 \(\ct{a}\leftrightarrow0,\ \ct{b}\leftrightarrow1,\dots,\ct{z}\leftrightarrow25\),於是字母可以相加減:

a b c d e f g h i j k l m
0 1 2 3 4 5 6 7 8 9 10 11 12
n o p q r s t u v w x y z
13 14 15 16 17 18 19 20 21 22 23 24 25

講義的三個例子:

  • \(\ct{a}+\ct{c}=\ct{c}\),即 \(0+2=2\);

  • \(\ct{b}-\ct{d}=\ct{y}\),即 \(1-3=-2\equiv24\);

  • \(\ct{f}-\ct{f}=\ct{a}\),即 \(5-5=0\)。

四條群性質照樣成立:\(x-x=0\)、\(x+y=y+x\)、\(x+0=0+x\)、\((x+y)+z=x+(y+z)\pmod{26}\)。

把字母想成時鐘上的 26 個刻度(封面的密碼盤)。「加 \(k\)」就是順時針轉 \(k\) 格,「減 \(k\)」逆時針轉 \(k\) 格,轉過 就接回 。 負數 \(-k\) 與 \(26-k\) 是同一個位置:\(-3\equiv23\)、\(-8\equiv18\)。

\(n=2\):位元的算術與 \(\oplus\)(講義 p. 5)

模 2 加法有專屬符號 \(\oplus\)(XOR,exclusive or): \[0\oplus0=0,\qquad 0\oplus1=1,\qquad 1\oplus0=1,\qquad 1\oplus1=0 .\] 讀法:「兩個位元不同時得 \(1\),相同時得 \(0\)」。四條性質變成: \[a\oplus a=0,\qquad a\oplus b=b\oplus a,\qquad a\oplus0=a,\qquad (a\oplus b)\oplus c=a\oplus(b\oplus c).\]

在 \(\Zn{2}\) 中 \(-1\equiv1\),所以「減」和「加」是同一件事:\(a\oplus a=0\) 說明每個位元的反元素就是它自己。 後果:一次性密碼本的 \(\Dec\) 與 \(\Enc\) 是同一個演算法(§[sec:otp]): \[(m\oplus\sk)\oplus\sk = m\oplus(\sk\oplus\sk) = m\oplus0 = m .\] 這一行用到了結合律、自反元素、單位元三條性質——模算術的性質不是裝飾,而是正確性證明的每一步。

逐元素的模算術(講義 p. 6)

對字串(向量)做運算時,逐位置獨立進行、不進位(schoolbook addition without carries)。講義的兩個例子:

\(n=2\): \[\begin{array}{r@{\;}*{8}{c}} & 0&1&0&0&0&1&0&1\\ \oplus\; & 0&1&1&1&0&1&1&0\\ \hline & 0&0&1&1&0&0&1&1 \end{array}\]

\(n=26\): \[\begin{array}{r@{\;}*{5}{c}} & \ct{h}&\ct{e}&\ct{l}&\ct{l}&\ct{o}\\ -\; & \ct{a}&\ct{b}&\ct{c}&\ct{d}&\ct{e}\\ \hline & \ct{h}&\ct{d}&\ct{j}&\ct{i}&\ct{k} \end{array} \qquad \begin{array}{r@{\;}*{5}{c}} & 7&4&11&11&14\\ -\; & 0&1&2&3&4\\ \hline & 7&3&9&8&10 \end{array}\]

「不進位」正是重點:第 \(i\) 個位置的結果只和第 \(i\) 個位置的輸入有關。 這讓加密可以逐字元定義(Caesar、Vigenère、一次性密碼本都是 \(c_i=m_i+k_i\) 的形式,差別只在 \(k_i\) 怎麼來),也讓敵手可以逐字元攻擊——這是 §[sec:cryptanalysis] 所有方法的共同基礎。

  • 能算 \(\ct{b}-\ct{d}\)、\(-3\bmod26\)、\((1\oplus1)\oplus1\) 這類題目,且知道負數要加 \(n\)。

  • 能說出 \((\Zn{n},+)\) 的四條性質,並指出 \(\Dec\) 的正確性用到哪幾條。

  • 知道 \(\oplus\) 就是模 2 加法、XOR 的真值表、以及 \(a\oplus a=0\) 使加解密同演算法。