仿射密碼

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

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

它的加密函數是e(x)=ax+b\pmod{m},其中

  • a和m互質。
  • m是字母的數目。

解碼函數是d(x)=a^{-1}(x-b)\pmod{m},其中a^{-1}是a在\mathbb{Z}_{m}群的乘法逆元。

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

介紹
於仿射加密中,大小為 m 之字母系統首先對應至 0 .. m-1範圍內之數值, 接著使用模算數來將原文件中之字母轉換為對應加密文件中的數字。
單一字母的加密函數為
:\mbox{E}(x)=(ax+b)\mod{m},
取餘 m 為字母系統大小且 a 和 b 為密碼關鍵值。 a 之值必須使得 a 與 m 互質. 解密方程為
:\mbox{D}(x)=a^{-1}(x-b)\mod{m},
此處 a^{-1}為 a 取模 m之模反元素 of I.e., 滿足等式
:1 = a a^{-1}\mod{m}.
a之乘法逆元素僅存在於 a 與 m互質條件下。 由此,沒有 a 的限制,可能無法解密。
易知解密方程逆於加密方程。
:
\begin{align}
\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{align}

弱處
因爲仿射密碼仍爲單字母表密碼,其依舊保留了該類別加密之弱處。當 a=1,仿射加密為凱撒密碼,因該加密方程可簡化為線性移動。

考慮加密英文。(即: m=26),不計26易凱薩密碼,總共有286非易仿射密碼。此數值是由於小於26之數中有12數與26互質。(a的可能值)。a 的每個值可有26互異之加法移動(b 之值);因此,共有 12*26 或 312 可能之關鍵值。因为密码缺少复杂性,根据柯克霍夫原則,这套系统是不安全的。

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

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

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

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

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

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

解密
於此解密範例中,欲解密之加密文件來自加密範例 。其解密方程為 \mbox{D}(y)=21(y-8)\mbox{ mod }26,經過計算, a^{-1} 為 21, b 為8, m 為 26。伊始之時,寫下加密文件中對應各字母之數值,如以下表格所示:

下一步,計算 21(y-8),再取結果除以26的餘數。以下表格顯示兩者計算後的結果。

解密的最後一部,藉由表格將數值轉回字母。解密的原始文件為 AFFINECIPHER。 以下為完成解密後的表格:

全數字母加密
為求加解密更快速,可加密全數字母以將原文件之字母一對一對應至加密文件。此範例中,一對一映射如下:

程式實例
用 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

或於 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

參見

  • 仿射變換
  • 凱撒密碼:a=1的特殊情況
  • Atbash code
  • ROT13

參考文獻
外部链接

评论 (0)

  • 还没有评论,来抢沙发吧。