仿射密碼

展示 17x+5 的仿射密碼。首先字母被轉換成介於0到25的數字，下一步對每個套用 17x+5，結果再取除26後的餘數，最後再轉回字母。

仿射密碼是一種替換密碼。它是一個字母對一個字母的。

它的加密函數是，其中

 和互質。
 是字母的數目。

解碼函數是，其中是在群的乘法逆元。

仿射密碼 為 單表加密的一種，字母系統中所有字母都藉一簡單數學方程加密，對應至數值，或轉回字母。 其仍有所有替代密碼之弱處。所有字母皆藉由方程 加密，  為移動大小。

介紹
於仿射加密中，大小為  之字母系統首先對應至 範圍內之數值， 接著使用模算數來將原文件中之字母轉換為對應加密文件中的數字。
單一字母的加密函數為 

取餘  為字母系統大小且  和  為密碼關鍵值。  之值必須使得  與  互質. 解密方程為

此處 為  取模 之模反元素 of I.e., 滿足等式 

之乘法逆元素僅存在於  與 互質條件下。 由此，沒有  的限制，可能無法解密。
易知解密方程逆於加密方程。

弱處
因爲仿射密碼仍爲單字母表密碼, 其依舊保留了該類別加密之弱處。當 ，仿射加密為 凱撒密碼 ，因該加密方程可簡化為線性移動。
考慮加密英文。(即： )，不計26易凱薩密碼，總共有286非易仿射密碼。此數值是由於小於26之數中有12數與26互質。 (的可能值).   的每個值可有26互異之加法移動(  之值); 因此，共有 12*26 或 312 可能之關鍵值。  因为密码缺少复杂性，根据柯克霍夫原則，这套系统是不安全的。

此密碼之首要弱處為，如果密碼學家可發現(如 頻率分析, 暴力破解, 臆測或任何其他方法) 加密文件兩字元之原文，則關鍵值可透過解一方程組得到。 由於我們知道  及  互質，這個事實可被用於快速破解密碼。

仿射密碼中同種的轉換使用於線性同餘方法，為伪随机数生成器中的一種。此產生器不為密码学安全伪随机数生成器，因仿射加密不安全。

範例
在以下一加密一解密的例子中，字母為從Ａ至Ｚ，且在表格中都有對應值。

加密
在加密範例中， 使用前述表格中各字母對應之數值可知欲加密的原文件為 "AFFINE CIPHER" ， 對應5,  對應 8, 而  對應 26 （因共使用26字母）。其中之值必須與的值26互質，所以其所有可能值包含1、3、5、7、9、11、15、17、19、21、23、25。若，則之值可隨機選定（因為b只讓密文值平移而已）。所以，此加密範例的函數為 .  加密訊息的首步即為寫出每個字母的數字值。

現在，取x各值並解等式的第一部份， 。 得出各字母對應的值後，取其對26的餘數。以下表格為加密的首四步驟。

加密訊息的最後一部，為查表求得對應字母的數值。 在此範例中，加密文本應為 IHHWVCSWFRCP。 以下表格顯示仿射加密一訊息的完整表格。

解密
於此解密範例中，欲解密之加密文件來自加密範例 。其解密方程為 ，經過計算，  為 21,  為8,  為 26。伊始之時，寫下加密文件中對應各字母之數值，如以下表格所示：

下一步，計算 ，再取結果除以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);

參見
 仿射變換
 凱撒密碼：的特殊情況
 Atbash code
 ROT13

參考文獻

外部链接
 在线仿射密码计算器 

古典密码