仿射密碼簡介:
仿射密碼和移位密碼一樣, 也是一種替換密碼. 不同的是, 移位密碼中, 我們使用的是模n加; 而在下面的仿射密碼中, 我們使用的上一節中介紹的模n乘. 在安全性方面, 仿射密碼同移位密碼一樣, 都是極其差的, 不僅因為他們的原理簡單, 更要命的是這兩種替換密碼沒有隱藏明文的字頻信息, 這很容易導致破解者輕易的攻破.
放射密碼中的一些概念:
1) 明密文字母表為Z26
2) 秘匙 K = (a,b) ∈ Z26_ × Z26 . 其中Z26_ 表示小於26且與26互素(或叫互質)的正整數的集合,這點非常重要的.
3) 加密變換為 y = (ax + b) mod 26 ;
很簡單?(呵呵, 先別急.) 我們先來引入一個定義.
大家知道, 好多東西都有逆, 大家讀小學時都知道,兩個數相乘乘機為1,則互為倒數, 其實是最簡單的逆. 后來, 我們到了高中, 我們學習了逆函數; 到了大學, 我們學習線性代數, 知道兩個矩陣的乘積為單位矩陣的話, 則這兩個矩陣互為逆矩陣.
現在我跟大家介紹另一種逆. 叫模逆. 其實很好理解的, 如下:
若a,b兩數的乘積對正整數n取模的結果為1. 則稱a,b 互為另外一個的模逆.
比如:
3*7 = 21; 21 % 20 = 1 ; 所以3,7 互為 20 的 模逆.
9*3 = 27; 27 % 26 = 1 ; 所以9,3 互為 26 的 模逆.
如何標記? 若a,b互為n的模逆 , 即b 為a 的模n的逆元 , 則記 b 為 a-1mod n 看了上面的定義, 我們知道:只有當 a 與 n 互素的時候, a 才是有模逆的. 其他情況下是不存在模逆的, 比如 2 對26 就沒有模逆. 這是個很簡單的數學問題, 大家動下手, 畫幾筆就清楚了.我就不多羅嗦了.
[思考] 大家能快速的求出11對123的模逆嗎? (放心,11和123是互素的.)
可能大家會這樣想:設其模逆為 b , 則 必定存在一個整數 t , 使得等式 11b = 123t + 1 成立.我們再變化一下, 也即所求為 必須使得 (11b - 1) % 123 = 0 恆成立. 到了這里, 如果使用筆算對b從2開始依次遞加窮舉的話,將會非常辛苦, 若將123換成一個更大一點的數, 用筆算窮舉更是不可能的.聰明你的肯定想說, 寫個程序算就行了啊. 不錯, 寫個程序幫我們窮舉的確很棒, 充分發揮了計算機的作用. 但這里, 我介紹給大家另外一種巧妙的方法 ---- 擴展歐幾里德變換:
123 = 1*123+ 0*11
11 = 0*123+ 1*11 |11
2 = 1*123+ (-11)*11 |5
1 = (-5)*123+ 56*11
聰明的你, 一定看出來了吧. 對! 我們將123和11都表示成 x * 123 + y * 11 的 格式, 然后相減, 在最右側一欄寫上每次減去的被減數的倍數. 依次進行, 知道減數變為1為止. 然后我們取第三列的最下面的一個數, 再對123 取模 即得11 對123的模逆. 對於這個變換, 不清楚的朋友,我勸你們最好動筆畫幾下. 那樣比我在這里說的起作用的多.嘿嘿~~
這個算法的好處:我們編寫這個算法的程序去求任何模逆都是非常高效的, 它幫我們以及CPU都節省了不少時間.為了加深理解, 來看一個例子:
[例子] :求 1211對13211的模逆 .
13211 1 0 //這一行的1和0是固定的.
1211 0 1 |10 //這一行0和1也是固定的, 后面的10是13211減掉的1211的倍數.意思為減掉10個1211.
1101 1 -10 |1 //第一個1為上一行的第二個1抄下來;-10 = 0 - 1*10 (上一行的算這一行的);后面的1依然為減掉的倍數.
110 -10 11 |10 //-10 為帶抄下來, 11 = 1 - (-10) *1 , 10 為倍數.
1 -120 //很快就到1了, 這時的 -120 就是我們要的.
-120 % 13211= 13091 即為 1211 對13211 的模逆. 怎么樣? 不錯吧. 呵呵.
我們可以用如下一段小程序來完成模逆的計算:
int Moni(int a,int n) { int p=a,q=n, t; int x = 0, y = 1, z = (int)q/p; while(1 != p && 1 != q) { t = p; p = q % p; q = t; t = y; y = x - y*z; x = t; z = (int) q/p; } y = y%n; if (y<0) { y += n; } return y; }
[再來看仿射]
剛才費了這么大的勁, 介紹了模逆, 還是為了在給仿射密碼的解密打地基.
我們看上面的放射密碼的加密公式 : y = (ax + b) mod 26 .
根據簡單的數論知識, 我們知道其解密變換為: x = a-1(y-b) mod 26 .(其中a-1中-1在右上角, 為a對26的模逆).
也即 x = a對26的模逆與(y-b)相乘后的積再對26取模, 最終結果即為解密后的內容.
下面我們來看一個實例:
[例子] 已知仿射密碼中密文為JACKOZOO ,字母表為Z26, 秘匙 K = (11,7) , 試解密.
解: 先求11對26的模逆: 11-1mod26 = 19 .
故解密變換為: x = 19(y-7) mod 26 ;
由 JACKOZOO
---> 9 0 2 10 14 25 14 14
---> 12 23 9 5 3 4 3 3
---> M X J F D E D D
所以明文為: MXJFDEDD.
有錯,望指教!