仿射密碼

仿射密碼是一種替換密碼。它是一個字母對一個字母的。 它的加密函數是 e ( x ) = a x + b ( mod m ) {\displaystyle e(x)=ax+b{\pmod {m}}} ，其中 a {\displaystyle a} 和 m {\displaystyle m} 互質。 m {\displaystyle m} 是字母的數目。 解碼函數是 d ( x ) = a − 1 ( x − b ) ( mod m ) {\displaystyle d(x)=a^{-1}(x-b){\pmod {m}}} ，其中 a − 1 {\displaystyle a^{-1}} 是 a {\displaystyle a} 在 Z m {\displaystyle \mathbb {Z} _{m}} 群的乘法逆元。 仿射密碼 為 單表加密的一種，字母系統中所有字母都藉一簡單數學方程加密，對應至數值，或轉回字母。 其仍有所有替代密碼之弱處。所有字母皆藉由方程 ( a x + b ) mod ( 26 ) {\displaystyle (ax+b)\mod (26)} 加密， b {\displaystyle b} 為移動大小。 於仿射加密中，大小為 m {\displaystyle m} 之字母系統首先對應至 0.. m − 1 {\displaystyle 0..m-1} 範圍內之數值， 接著使用模算數來將原文件中之字母轉換為對應加密文件中的數字。 單一字母的加密函數為 E ( x ) = ( a x + b ) mod m , {\displaystyle {\mbox{E}}(x)=(ax+b)\mod {m},} 取餘 m {\displaystyle m} 為字母系統大小且 a {\displaystyle a} 和 b {\displaystyle b} 為密碼關鍵值。 a {\displaystyle a} 之值必須使得 a {\displaystyle a} 與 m {\displaystyle m} 互質. 解密方程為 D ( x ) = a − 1 ( x − b ) mod m , {\displaystyle {\mbox{D}}(x)=a^{-1}(x-b)\mod {m},} 此處 a − 1 {\displaystyle a^{-1}} 為 a {\displaystyle a} 取模 m {\displaystyle m} 之模反元素 of I.e., 滿足等式 1 = a a − 1 mod m . {\displaystyle 1=aa^{-1}\mod {m}.} a {\displaystyle a} 之乘法逆元素僅存在於 a {\displaystyle a} 與 m {\displaystyle m} 互質條件下。 由此，沒有 a {\displaystyle a} 的限制，可能無法解密。 易知解密方程逆於加密方程。 D ( E ( x ) ) = a − 1 ( E ( x ) − b ) mod m = a − 1 ( ( ( a x + b ) mod m ) − b ) mod m = a − 1 ( a x + b − b ) mod m = a − 1 a x mod m = x mod m . {\displaystyle {\begin{aligned}{\mbox{D}}({\mbox{E}}(x))&=a^{-1}({\mbox{E}}(x)-b)\mod {m}\\&=a^{-1}(((ax+b)\mod {m})-b)\mod {m}\\&=a^{-1}(ax+b-b)\mod {m}\\&=a^{-1}ax\mod {m}\\&=x\mod {m}.\end{aligned}}} 因爲仿射密碼仍爲單字母表密碼, 其依舊保留了該類別加密之弱處。當 a = 1 {\displaystyle a=1} ，仿射加密為 凱撒密碼 ，因該加密方程可簡化為線性移動。 考慮加密英文。(即： m = 26 {\displaystyle m=26} )，不計26易凱薩密碼，總共有286非易仿射密碼。此數值是由於小於26之數中有12數與26互質。 ( a {\displaystyle a} 的可能值). a {\displaystyle a} 的每個值可有26互異之加法移動( b {\displaystyle b} 之值); 因此，共有 12*26 或 312 可能之關鍵值。 因为密码缺少复杂性，根据柯克霍夫原則，这套系统是不安全的。 此密碼之首要弱處為，如果密碼學家可發現(如 頻率分析, 暴力破解, 臆測或任何其他方法) 加密文件兩字元之原文，則關鍵值可透過解一方程組得到。 由於我們知道 a {\displaystyle a} 及 m {\displaystyle m} 互質，這個事實可被用於快速破解密碼。 仿射密碼中同種的轉換使用於線性同餘方法，為伪随机数生成器中的一種。此產生器不為密码学安全伪随机数生成器，因仿射加密不安全。 在以下一加密一解密的例子中，字母為從Ａ至Ｚ，且在表格中都有對應值。 在加密範例中， 使用前述表格中各字母對應之數值可知欲加密的原文件為 "AFFINE CIPHER" ， a {\displaystyle a} 對應5, b {\displaystyle b} 對應 8, 而 m {\displaystyle m} 對應 26 （因共使用26字母）。其中 a {\displaystyle a} 之值必須與 m {\displaystyle m} 的值26互質，所以其所有可能值包含1、3、5、7、9、11、15、17、19、21、23、25。若 a ≠ 1 {\displaystyle a\neq 1} ，則 b {\displaystyle b} 之值可隨機選定（因為b只讓密文值平移而已）。所以，此加密範例的函數為 y = E ( x ) = ( 5 x + 8 ) ( mod 26 ) {\displaystyle y=E(x)=(5x+8){\pmod {26}}} . 加密訊息的首步即為寫出每個字母的數字值。 現在，取x各值並解等式的第一部份， ( 5 x + 8 ) {\displaystyle (5x+8)} 。 得出各字母對應 ( 5 x + 8 ) {\displaystyle (5x+8)} 的值後，取其對26的餘數。以下表格為加密的首四步驟。 加密訊息的最後一部，為查表求得對應字母的數值。 在此範例中，加密文本應為 IHHWVCSWFRCP。 以下表格顯示仿射加密一訊息的完整表格。 於此解密範例中，欲解密之加密文件來自加密範例 。其解密方程為 D ( y ) = 21 ( y − 8 )  mod  26 {\displaystyle {\mbox{D}}(y)=21(y-8){\mbox{ mod }}26} ，經過計算， a − 1 {\displaystyle a^{-1}} 為 21, b {\displaystyle b} 為8, m {\displaystyle m} 為 26。伊始之時，寫下加密文件中對應各字母之數值，如以下表格所示： 下一步，計算 21 ( y − 8 ) {\displaystyle 21(y-8)} ，再取結果除以26的餘數。以下表格顯示兩者計算後的結果。 解密的最後一部，藉由表格將數值轉回字母。解密的原始文件為 AFFINECIPHER。 以下為完成解密後的表格： 為求加解密更快速，可加密全數字母以將原文件之字母一對一對應至加密文件。此範例中，一對一映射如下： 用 Python 程式語言，以下代碼可用於加密羅馬字母Ａ至Ｚ。 # 列印仿射密碼的字母表。 # a必須與m互質 def affine(a, b): for i in range(26): print chr(i+65) + ": " + chr(((a*i+b)%26)+65) # 調用函數的例子 affine(5, 8) 或者以Java作例: public void Affine(int a, int b){ for (int num = 0; num < 26; num++) System.out.println(((char)('A'+num)) + ":" + ((char)('A'+(a*num + b)% 26)) ); } Affine(5,8) 或於 Pascal: Procedure Affine(a,b : Integer); begin for num := 0 to 25 do WriteLn(Chr(num+65) , ': ' , Chr(((a*num + b) mod 26) + 65); end; begin Affine(5,8) end. 在 PHP的實現: function affineCipher($a, $b) { for($i = 0; $i < 26; $i++) { echo chr($i + 65) . ' ' . chr(65 + ($a * $i + $b) % 26) . '<br>'; } } affineCipher(5, 8); 仿射變換 凱撒密碼： a = 1 {\displaystyle a=1} 的特殊情況 Atbash code ROT13 Kozdron, Michael. Aﬃne Ciphers (PDF). [22 April 2014]. （原始内容存档 (PDF)于2016-04-09）.  在线仿射密码计算器[永久失效連結] （英文）