基本介紹
介紹,缺點,範例,加密,解密,全數字母加密,程式實例,
介紹
仿射密碼為單表加密的一種,字母系統中所有字母都藉一簡單數學方程加密,對應至數值,或轉回字母。 其仍有所有替代密碼之弱處。所有字母皆藉由方程加密,b為移動大小。
在仿射加密中,大小為m之字母系統首先對應至0..m-1範圍內之數值, 接著使用模數算數來將原檔案中之字母轉換為對應加密檔案中的數字。 單一字母的加密函式為
取余m為字母系統大小且a和b為密碼關鍵值。a之值必須使得a與m互質。解密方程為
此處滿足等式。
a之乘法逆元素僅存在於a與m互質條件下。 由此,沒有a的限制,可能無法解密。 易知解密方程逆於加密方程。
缺點
因為仿射密碼仍為單字母表密碼, 其依舊保留了該類別加密之弱處。當a=1,仿射加密為凱撒密碼,因該加密方程可簡化為線性移動。 考慮加密英文。(即:m=26),不計26易凱薩密碼,總共有286非易仿射密碼。此數值是由於小於26之數中有12數與26互質。a 的每個值可有26互異之加法移動(b之值);因此,共有 12*26 或 312 可能之關鍵值。 因為密碼缺少複雜性,根據柯克霍夫原則,這套系統是不安全的。
仿射密碼中同種的轉換使用於線性虛擬隨機產生器, 為虛擬隨機數產生器其中一種。 此產生器不為安全加密虛擬隨機數產生器,因仿射密碼不安全。
範例
在以下一加密一解密的例子中,字母為從A至Z,且在表格中都有對應值。
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
加密
在加密範例中,,使用前述表格中各字母對應之數值可知欲加密的原檔案為 "AFFINE CIPHER" ,a對應5,b對應 8,而m對應26 (因共使用26字母)。a的所有可能值有 1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 與 25。 若a不等於 1,b之值可隨機選定, 所以,此加密範例的函式為。加密訊息的首步即為寫出每個字母的數字值。
原始檔案: | A | F | F | I | N | E | C | I | P | H | E | R |
x: | 0 | 5 | 5 | 8 | 13 | 4 | 2 | 8 | 15 | 7 | 4 | 17 |
現在,取x各值並解等式的第一部分,(5x+8)。 得出各字母對應 (5x+8)的值後,取其對26的餘數。以下表格為加密的首四步驟。
原始檔案: | A | F | F | I | N | E | C | I | P | H | E | R |
x | 0 | 5 | 5 | 8 | 13 | 4 | 2 | 8 | 15 | 7 | 4 | 17 |
5x+8 | 8 | 33 | 33 | 48 | 73 | 28 | 18 | 48 | 83 | 43 | 28 | 93 |
(5x+8)mod26 | 8 | 7 | 7 | 22 | 21 | 2 | 18 | 22 | 5 | 17 | 2 | 15 |
加密訊息的最後一步,為查表求得對應字母的數值。 在此範例中,加密文本應為 IHHWVCSWFRCP。 以下表格顯示仿射加密一訊息的完整表格。
原始檔案: | A | F | F | I | N | E | C | I | P | H | E | R |
x | 0 | 5 | 5 | 8 | 13 | 4 | 2 | 8 | 15 | 7 | 4 | 17 |
5x+8 | 8 | 33 | 33 | 48 | 73 | 28 | 18 | 48 | 83 | 43 | 28 | 93 |
(5x+8)pmod26 | 8 | 7 | 7 | 22 | 21 | 2 | 18 | 22 | 5 | 17 | 2 | 15 |
加密檔案: | I | H | H | W | V | C | S | W | F | R | C | P |
解密
於此解密範例中,欲解密之加密檔案來自加密範例 。其解密方程為,經過計算,a-1為 21,b為8,m為 26。伊始之時,寫下加密檔案中對應各字母之數值,如以下表格所示:
密文: | I | H | H | W | V | C | S | W | F | R | C | P |
y: | 8 | 7 | 7 | 22 | 21 | 2 | 18 | 22 | 5 | 17 | 2 | 15 |
下一步,計算21(y-8),再取結果除以26的餘數。以下表格顯示兩者計算後的結果。
密文: | I | H | H | W | V | C | S | W | F | R | C | P |
y: | 8 | 7 | 7 | 22 | 21 | 2 | 18 | 22 | 5 | 17 | 2 | 15 |
21(y-8): | 0 | -21 | -21 | 294 | 273 | -126 | 210 | 294 | -63 | 189 | -126 | 147 |
(21(y-8)) mod 26: | 0 | 5 | 5 | 8 | 13 | 4 | 2 | 8 | 15 | 7 | 4 | 17 |
解密的最後一步,藉由表格將數值轉回字母。解密的原始檔案為 AFFINECIPHER。 以下為完成解密後的表格:
加密檔案: | I | H | H | W | V | C | S | W | F | R | C | P |
y: | 8 | 7 | 7 | 22 | 21 | 2 | 18 | 22 | 5 | 17 | 2 | 15 |
21(y-8): | 0 | -21 | -21 | 294 | 273 | -126 | 210 | 294 | -63 | 189 | -126 | 147 |
(21(y-8)) mod 26: | 0 | 5 | 5 | 8 | 13 | 4 | 2 | 8 | 15 | 7 | 4 | 17 |
原檔案: | A | F | F | I | N | E | C | I | P | H | E | R |
全數字母加密
為求加解密更快速,可加密全數字母以將原檔案之字母一對一對應至加密檔案。此範例中,一對一映射如下:
原檔案中字母 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
原檔案中數字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
(5x+8)mod(26) | 8 | 13 | 18 | 23 | 2 | 7 | 12 | 17 | 22 | 1 | 6 | 11 | 16 | 21 | 0 | 5 | 10 | 15 | 20 | 25 | 4 | 9 | 14 | 19 | 24 | 3 |
加密檔案字母 | I | N | S | X | C | H | M | R | W | B | G | L | Q | V | A | F | K | P | U | Z | E | J | O | T | Y | D |
程式實例
用Python程式語言,以下代碼可用於加密羅馬字母A至Z。
# 列印仿射密碼的字母表。# 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)